Сообщение не работает
(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)