Сообщение не работает

(defun my-message (format-string &rest args)
  (apply 'message
         (concat "my-message: " format-string)
         args))

(my-message "abc %d" 123)
;; ==> "my-message: abc 123"
(message "abc %d" 123)
;; ==> "abc 123"

(advice-add 'message :around 'my-message)
;;(advice-remove 'message 'my-message)

После advice-add в message, ошибка Wrong type argument: sequencep, #<subr message> сигнализируется. В чем проблема?

1 ответ

Решение

Так как вы используете :around совет, ваш my-message Функция получает исходную функцию в качестве первого аргумента. В вашем коде отсутствует этот аргумент, и вместо этого первый аргумент рассматривается как строка формата сообщения. Измени свой my-message указать дополнительный аргумент:

(defun my-message (orig-fun format-string &rest args)
  (apply orig-fun
         (concat "my-message: " format-string)
         args))

и тогда совет будет работать как положено. Обратите внимание, как эта версия вызывает orig-fun вместо жесткого кодирования 'message как apply цель.

Вам не нужно :around совет для этого случая, хотя. Все, что вы делаете, это изменяете строку формата, так что вы можете вместо этого использовать :filter-args, который позволяет изменять аргументы до того, как они будут переданы в исходную функцию. Вот пример, который работает для вашего случая:

(defun my-message (args)
  (nconc (list (concat "my-message: " (car args))) (cdr args)))
(advice-add 'message :filter-args #'my-message)
Другие вопросы по тегам