Emacs defadvice可以在原始函数中使用变量吗?

Emacs defadvice可以在原始函数中使用变量吗?,emacs,elisp,advising-functions,defadvice,Emacs,Elisp,Advising Functions,Defadvice,让我来举一个修改后的例子 (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正文中未提供的可选参数(或者更一般地说,原始函数中的变量)因为(setq c 4)fromMy add更改了环境,而不是给定的参数,我认为您无法得到想要的 我的最佳选择是使用特殊变量遵循以下丑陋的方式: (defvar *specia

让我来举一个修改后的例子

(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
正文中未提供的可选参数(或者更一般地说,原始函数中的变量)

因为
(setq c 4)
from
My 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)))

一般来说,你不能
defadvice
(以及新的
advice 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)))