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)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)))
于 2012-12-04T08:22:37.127 に答える
1

一般的には、できません。 defadvice(および新しい) は、関数の周りadvice-addにコードを追加するように設計されていますが、その内部にアクセスすることはできません。

于 2012-12-04T13:45:27.417 に答える