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
.
您的代码中有两个问题.首先(正如您所说),您使用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)
归档时间: |
|
查看次数: |
1216 次 |
最近记录: |