1

让我以Emacs Lisp 中的修改示例为例:如何使用 ad-get-arg 和 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正文中使用未提供的可选参数(或更一般地说,原始函数中的变量)?

4

2 回答 2

1

由于(setq c 4)frommy-add改变环境,没有给定参数,我认为你无法得到你想要的。

我最好的选择是使用特殊变量遵循丑陋的方式:

(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)))
于 2012-12-04T08:22:37.127 回答
1

一般来说,你不能。 defadvice(以及 new advice-add)旨在为函数添加代码但不允许您访问其内部。

于 2012-12-04T13:45:27.417 回答