我不确定我是否正确地使用了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)最后一个表达式会导致一个错误:
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)叛逃建议发出警告:
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))()为了调试目的,我试图使用didn来查看启动过程参数,而我发现我使用ad-get-arg的方法不起作用。
更新:答案,
从答案看,我应该在(ad-get-args 0)中使用(ad-get-args)而不是(defadvice my-add ..)中的(ad-get-args),而在(defadvice my-substract ..)中应该使用ad-do-it而不是(ad-do-it)。最好使用trace-function。
发布于 2010-04-12 13:56:18
您的代码中有两个问题。首先(正如您所提到的),您使用的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)来自建议库中的文档:
forms通知可以指定包装或包围表单的表单应该与特殊关键字
ad-do-it放在一起的位置,该关键字将被包含被包围代码的表单的progn替换。
我发现的关于建议的最好的教程和介绍是在建议库本身(在开始时的注释中)。
M-x find-library advice RET发布于 2010-04-12 13:46:17
这样做是可行的:
(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) 在将参数传递给消息函数时,必须考虑要检索的参数的类型。我认为你所犯的错误是在建议中发生的事实所掩盖的。如果建议中没有错误,您将看到一条更清晰的消息,表示类型不匹配。
当有疑问时,或者当您将一个不是字符串的arg传递给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))))发布于 2010-04-12 14:17:18
不需要使用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) https://stackoverflow.com/questions/2622351
复制相似问题