【问题标题】:can defadvice use variables in the original function?defadvice 可以在原始函数中使用变量吗?
【发布时间】:2012-12-04 07:49:07
【问题描述】:

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

【问题讨论】:

    标签: emacs elisp advising-functions defadvice


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于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)))
      

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 2021-11-18
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多