Emacs Lisp:如何使用ad-get-arg和ad-get-args?

Yoo*_*Yoo 2 emacs logging elisp

我不确定我是否正在使用ad-get-args和ad-get-arg.

例如,以下代码不起作用.

(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)
Run Code Online (Sandbox Code Playgroud)

最后一个表达式导致错误:

Debugger entered--Lisp error: (void-function ad-get-args).
Run Code Online (Sandbox Code Playgroud)

以下也不起作用.

(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)
Run Code Online (Sandbox Code Playgroud)

defadvice发出警告:

Warning: `(setq ad-return-value (ad-Orig-my-substract a b))' is a malformed
    function
Run Code Online (Sandbox Code Playgroud)

最后一个表达式给出了一个错误:

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))()
Run Code Online (Sandbox Code Playgroud)

我试图使用defadvice来监视启动进程参数以进行调试,我发现使用ad-get-arg的方法不起作用.

更新:答案,

从答案中可以看出,我应该使用(ad-get-args 0)而不是(ad-get-args)in (defadvice my-add ..),而我应该使用ad-do-it而不是(ad-do-it)in in (defadvice my-substract ..).并且最好使用trace-function.

Tre*_*son 7

您的代码中有两个问题.首先(正如您所说),您使用ad-get-args不当.文档说:

(ad-get-args <position>)将返回从开始提供的实际参数列表<position>.

它看起来像你想要的是:

(defadvice my-add (after my-log-on activate)
  (message "my-add: %s" (ad-get-args 0)))
Run Code Online (Sandbox Code Playgroud)

在你my-subtract的问题是你的使用ad-do-it,你有它被括号包围,它不应该.这是正确的用法:

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

从建议库中的文档:

around建议可以指定包装或包围表单的形式应该使用特殊关键字的位置ad-do-it,该关键字将替换为progn包含所包围代码的形式的关键字.

我发现的最好的教程和建议介绍在建议库本身(在开头的评论中).

M-x find-library advice RET
Run Code Online (Sandbox Code Playgroud)