GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Advice-Combinators.html ・ emacs-doc.conao3.com

13.12.3 アドバイスの構成方法

以下に、アドバイス function と元の関数をどのように合成するかを指定する、add-function および advice-add の引数 where が取り得る各種の値を示します。

:before

旧関数の前に function を呼び出します。どちらの関数も同じ引数を受け取り、合成関数の戻り値は旧関数の戻り値となります。より具体的には、2つの関数の合成は次のように動作します:

(lambda (&rest r) (apply function r) (apply oldfun r))

(add-function :before funvar function) は、単一機能フックにおいて通常のフックの (add-hook 'hookvar function) に相当します。

:after

旧関数の後に function を呼び出します。どちらの関数も同じ引数を受け取り、合成関数の戻り値は旧関数の戻り値となります。より具体的には、2つの関数の合成は次のように動作します:

(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))

(add-function :after funvar function) は、単一機能フックにおいて通常のフックの (add-hook 'hookvar function 'append) に相当します。

:override

これにより、古い関数が新しい関数に完全に置き換えられます。もちろん、後で remove-function を呼び出せば、古い関数を復元することも可能です。

:around

従来の関数の代わりに function を呼び出しつつ、従来の関数を function への追加引数として渡します。これが最も柔軟な合成方法です。例えば、従来の関数を異なる引数で呼び出したり、複数回呼び出したり、あるいは let 束縛の中で呼び出したりできます。また、処理を従来の関数に委譲する場合もあれば、完全に上書きする場合もあります。より具体的に述べると、これら2つの関数の合成は次のように動作します:

(lambda (&rest r) (apply function oldfun r))
:before-while

旧関数を呼び出す前に function を呼び出し、function が nil を返す場合は旧関数を呼び出さないようにします。どちらの関数も同じ引数を受け取り、合成関数の戻り値は旧関数の戻り値となります。より具体的には、2つの関数の合成は次のように動作します:

(lambda (&rest r) (and (apply function r) (apply oldfun r)))

(add-function :before-while funvar function) は、hookvar が run-hook-with-args-until-failure 経由で実行される場合、単一機能フックにおいて (add-hook 'hookvar function) と同等です。

:before-until

旧関数を呼び出す前に function を呼び出し、function が nil を返す場合にのみ旧関数を呼び出す。より具体的には、2つの関数の合成は次のように動作する:

(lambda (&rest r) (or (apply function r) (apply oldfun r)))

(add-function :before-until funvar function) は、hookvar が run-hook-with-args-until-success 経由で実行される場合、単一機能フックにおいて (add-hook 'hookvar function) と同等です。

:after-while

旧関数の後に function を呼び出し、かつ旧関数が nil 以外を返した場合にのみ呼び出す。両関数は同じ引数を受け取り、合成関数の戻り値は function の戻り値となる。より具体的には、2つの関数の合成は次のように動作する:

(lambda (&rest r) (and (apply oldfun r) (apply function r)))

(add-function :after-while funvar function) は、hookvar が run-hook-with-args-until-failure 経由で実行される場合、単一機能フックにおいて (add-hook 'hookvar function 'append) と同等です。

:after-until

旧関数の後に function を呼び出し、かつ旧関数が nil を返した場合にのみ呼び出す。より具体的には、2つの関数の合成は次のように動作する:

(lambda (&rest r) (or  (apply oldfun r) (apply function r)))

(add-function :after-until funvar function) は、hookvar が run-hook-with-args-until-success 経由で実行される場合、単一機能フックにおいて (add-hook 'hookvar function 'append) と同等です。

:filter-args

まず function を呼び出し、その結果(リストになるはずです)を、元の関数に渡す新しい引数として使用します。より具体的に言うと、2つの関数の合成は次のように動作します:

(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return

まず古い関数を呼び出し、その結果をfunctionに渡します。より具体的には、2つの関数の合成は次のように動作します:

(lambda (&rest r) (funcall function (apply oldfun r)))
:interactive-only

where オプションは2つの関数の本体の構成方法を制御しますが、インタラクティブフォームの構成方法には実際には影響を与えません。したがって、ある意味ではこれは :override とは逆の動作となり、あたかもアドバイスが適用されていないかのように、古い関数のみを呼び出します。しかし、他の where 値と同様に、インタラクティブフォームには影響を与えます。function のインタラクティブフォーム(もしあれば)は oldfun のものを上書きし、それがラムダ式である場合は、function のインタラクティブフォームを引数として受け取ります。例については、advice-eval-interactive-spec を参照してください。