首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs Lisp:如何使用args arg和ad-get-args?

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

Stack Overflow用户
提问于 2010-04-12 13:23:57
回答 3查看 1.4K关注 0票数 2

我不确定我是否正确地使用了args和ad-get-arg

例如,下面的代码无法工作。

代码语言:javascript
复制
(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)

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

代码语言:javascript
复制
Debugger entered--Lisp error: (void-function ad-get-args).

下面的内容也不起作用。

代码语言:javascript
复制
(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)

叛逃建议发出警告:

代码语言:javascript
复制
Warning: `(setq ad-return-value (ad-Orig-my-substract a b))' is a malformed
    function

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

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-12 13:56:18

您的代码中有两个问题。首先(正如您所提到的),您使用的ad-get-args不正确。医生说:

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

看起来你想要的是:

代码语言:javascript
复制
(defadvice my-add (after my-log-on activate)
  (message "my-add: %s" (ad-get-args 0)))

在您的my-subtract中,问题在于您对ad-do-it的使用,它被括号包围,不应该是这样。这是正确的用法:

代码语言:javascript
复制
(defadvice my-substract (around my-log-on activate)
  (message "my-substract: %s" (ad-get-arg 0))
  ad-do-it)

来自建议库中的文档:

forms通知可以指定包装或包围表单的表单应该与特殊关键字ad-do-it放在一起的位置,该关键字将被包含被包围代码的表单的progn替换。

我发现的关于建议的最好的教程和介绍是在建议库本身(在开始时的注释中)。

代码语言:javascript
复制
M-x find-library advice RET
票数 7
EN

Stack Overflow用户

发布于 2010-04-12 13:46:17

这样做是可行的:

代码语言:javascript
复制
(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)

就像这样:

代码语言:javascript
复制
(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))))
票数 3
EN

Stack Overflow用户

发布于 2010-04-12 14:17:18

不需要使用ad-get-arg,您可以在建议的正文中使用相同的名称:

代码语言:javascript
复制
(defun my-add (a b)
  (+ a b))
(defadvice my-add (after my-add-log activate)
  (message "my-add: %d %d" a b))

更新

如果您只想为了调试目的跟踪函数调用,emacs可以为您生成适当的跟踪建议:

代码语言:javascript
复制
(defun my-add (a b)
  (+ a b))
(trace-function 'my-add) 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2622351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档