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