让我以Emacs Lisp: How to use ad-get-arg and ad-get-args?中修改后的示例为例
(defun my-add (a b &optional c)
(+ a b)
(unless c
(setq c 4)))
(defadvice my-add (after my-log-on (a b &optional c) activate)
(message "my-add a: %s" a)
(message "my-add: %s" c))(my-add 1 2 3)可以很好地运行,输出如下:
my-add a: 1
my-add: 3但(my-add 1 2)无法从原始函数获取c值:
my-add a: 1
my-add: nil我的问题是,如何在defadvice主体中使用未提供的可选参数(或者更一般地说,原始函数中的变量)?
发布于 2012-12-04 21:45:27
一般来说,你不能。defadvice (以及新的advice-add)被设计成在函数周围添加代码,但不允许你访问它的内部。
发布于 2012-12-04 16:22:37
因为来自my-add的(setq c 4)改变了环境,而不是给定的参数,我认为你不能得到你想要的。
我最好的办法是使用特殊变量遵循丑陋的方式:
(defvar *special*)
(defun my-add (a b &optional c)
(+ a b)
(unless c
(setq c 4)
(setq *special* 4)))
(defadvice my-add (after my-log-on (a b &optional c) activate)
(message "my-add a: %s" a)
(if (null c)
(message "my-add *special*: %s" *special*)
(message "my-add: %s" c)))https://stackoverflow.com/questions/13698267
复制相似问题