Next: , Previous: , Up: Advising Functions   [Contents][Index]


12.10.3 Ways to compose advices

以下はadd-functionおよびadvice-addwhere引数に可能な値で、そのアドバイスfunctionと元の関数が構成されるべき方法を指定します。

:before

古い関数の前にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :before funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after

古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :after funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:override

これは古い関数を新しい関数に完全に置き換えます。もちろん、remove-functionを呼び出した後に、古い関数は復元されます。

:around

古い関数のかわりにfunctionを呼び出しますが、古い関数はfunctionの追加の引数になります。これはもっとも柔軟な結合です。たとえば、古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になります。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合は古い関数を呼び出しません。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :before-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:before-until

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合だけ古い関数を呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :before-until funvar function) は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after-while

古い関数が非nilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、functionのreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :after-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:after-until

古い関数がnilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

(add-function :after-until funvar function)は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:filter-args

最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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

最初に古い関数を呼び出し、その結果をfunctionに渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

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