Emacs Lisp: Как использовать ad-get-arg и ad-get-args? - PullRequest
2 голосов
/ 12 апреля 2010

Я не уверен, что использую ad-get-args и ad-get-arg right.

Например, следующий код не работает.

(defun my-add (a b)
  (+ a b))
(defadvice my-add (after my-log-on activate)
  (message "my-add: %s" (ad-get-args)))
(my-add 1 2)

Последнее выражение вызывает ошибку:

Debugger entered--Lisp error: (void-function ad-get-args).

Следующее также не работает.

(defun my-substract (a b)
  (- a b))
(defadvice my-substract (around my-log-on activate)
  (message "my-substract: %s" (ad-get-arg 0))
  (ad-do-it))
(my-substract 10 1)

Defadvice выдает предупреждение:

Warning: `(setq ad-return-value (ad-Orig-my-substract a b))' is a malformed
    function

И последнее выражение выдает ошибку:

Debugger entered--Lisp error: (invalid-function (setq ad-return-value (ad-Orig-my-substract a b)))
  (setq ad-return-value (ad-Orig-my-substract a b))()

Я пытался использовать defadvice для просмотра аргументов запуска процесса в целях отладки, и я обнаружил, что мой способ использования ad-get-arg не работает.

Обновление: ответ,

Из ответов получается, что я должен был использовать (ad-get-args 0) вместо (ad-get-args) в (defadvice my-add ..), и я должен был использовать ad-do-it вместо (ad-do-it) в (defadvice my-substract ..). И лучше использовать trace-function.

Ответы [ 3 ]

7 голосов
/ 12 апреля 2010

У вас есть две проблемы в вашем коде. Во-первых (как вы заметили), вы используете ad-get-args неправильно. Документы говорят:

(ad-get-args <position>) будет вернуть список актуальных аргументов поставляется начиная с <position>.

Похоже, что вы хотите:

(defadvice my-add (after my-log-on activate)
  (message "my-add: %s" (ad-get-args 0)))

В вашем my-subtract проблема заключается в том, что вы используете ad-do-it, он заключен в круглые скобки, так быть не должно. Это правильное использование:

(defadvice my-substract (around my-log-on activate)
  (message "my-substract: %s" (ad-get-arg 0))
  ad-do-it)

Из документов в библиотеке рекомендаций:

В ближайшем совете можно указать, где формы завернутые или окруженные формы должны идти со специальным ключевое слово ad-do-it, которое будет замещенный progn, содержащий формы окружающего кода.

Лучший учебник и введение в советы, которые я нашел, находятся в самой библиотеке рекомендаций (в комментариях в начале).

M-x find-library advice RET
3 голосов
/ 12 апреля 2010

Нет необходимости использовать ad-get-arg , вы можете использовать те же имена в теле совета:

(defun my-add (a b)
  (+ a b))
(defadvice my-add (after my-add-log activate)
  (message "my-add: %d %d" a b))

Обновление

Если вы просто хотите отслеживать вызовы функций в целях отладки, emacs может сгенерировать правильное Совет по трассировке для вас:

(defun my-add (a b)
  (+ a b))
(trace-function 'my-add) 
3 голосов
/ 12 апреля 2010

Это работает:

(defun my-add (a b) 
  (+ a b))

(defadvice my-add (after my-log-on activate) 
  (message "my-add: %d %d" (ad-get-arg 0) (ad-get-arg 1)))

(my-add 1 2) 

Вы должны учитывать тип аргумента, который вы получаете, при передаче его функции сообщения. Я думаю, что ошибки, которые вы получаете, скрыты тем фактом, что они встречаются в совете. Если бы ошибки не были советом, вы бы увидели более четкое сообщение, указывающее на несоответствие типов.

Если вы сомневаетесь или когда вы передаете аргумент, который не является строкой, в message, используйте (prin1-to-string arg)

как это:

(defadvice my-add (after my-log-on activate) 
  (message "my-add: %s %s"
           (prin1-to-string (ad-get-arg 0))
           (prin1-to-string (ad-get-arg 1))))
...