Next: Advising Named Functions, Up: Advising Functions [Contents][Index]
このマクロはplace(Generalized Variablesを参照)に格納された関数に、アドバイスfunctionを追加する手軽な方法である。
whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Advice combinatorsを参照してください。
(通常は名前が-function
で終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができる。placeが単にシンボルならfunctionはplaceのグローバル値に追加される。placeが(local
symbol)
というフォームなら、symbolはその変数の名前をリターンする式なので、functionはカレントバッファーだけに追加される。最後にレキシカル変数を変更したければ、(var
variable)
を使用する必要があるだろう。
add-function
で追加されたすべての関数は、自動的にプロパティーpropsの連想リストに加えることができる。現在のところ特別な意味をもつのは以下の2つのプロパティーのみ:
name
これはアドバイスの名前を与える。この名前はremove-function
が取り除く関数を識別するのに使用できます。これは通常はfunctionが無名関数のときに使用されます。
depth
これは複数のアドバイスが与えられたときに、どのようにアドバイスを順番づけるかを指定します。depthのデフォルト0です。depthが100のとき、このアドバイスは可能な限りの深さを保持すべきことを意味し、-100のときは最外のアドバイスに留めることを意味します。同じdepthで2つのアドバイスが指定された場合、もっとも最近に追加されたアドバイスが最外になります。
:before
アドバイスにたいしては、最外(outermost)になるということは、このアドバイスが他のアドバイスの前、つまり1番目に実行されることを意味し、最内(innermost)とは元の関数が実行される直前、すなわちこのアドバイスと元の関数の間に実行されるアドバイスは存在しないことを意味します。同様に:after
アドバイスにたいしては、最内とは元の関数の直後、つまりこの元の関数とアドバイスの間に実行される他のアドバイスは存在せず、最外とは他のすべてのアドバイスが実行された後にこのアドバイスが実行されることを意味します。:override
の最内アドバイスは、元の関数だけをオーバーライドし、他のアドバイスは適用されませんが、:override
の最外アドバイスは元の関数だけではなく。その他すべての適用済みのアドバイスををオーバーライドします。
functionがインタラクティブでなければ合成された関数は、(もしあれば)元の関数のインタラクティブ仕様(interactive
spec)を継承します。それ以外なら合成された関数はインタラクティブとなりfunctionのインタラクティブ仕様を使用します。1つ例外があります。functionのインタラクティブ仕様が(式や文字列ではない)関数なら、元の関数のインタラクティブ仕様を唯一の引数としてその関数を呼び出して、それが合成された関数のインタラクティブ指定になります。引数として受け取ったインタラクティブ仕様を解釈するためにはadvice-eval-interactive-spec
を使用します。
注意:
functionのインタラクティブ仕様は合成された関数に適用され、functionではなく結合された関数の呼び出し規約に従うこと。多くの場合これらは等しいので差異は生じないが、functionの:around
、:filter-args
、filter-return
では重要になる。
このマクロはplaceに格納された関数からfunctionを取り除く。これはadd-function
を使用してfunctionがplaceに追加されたときだけ機能する。
functionはplaceに追加された関数にたいして、ラムダ式にたいしても機能するようにequal
を使用して比較を試みる。これは追加でplaceに追加された関数のname
プロパティーも比較する。これはequal
を使用してラムダ式を比較するより信頼性がある。
adviceがすでにfunction-def内にあれば非nil
をリターンする。上記のremove-function
と同様、実際の関数adviceのかわりにアドバイスのname
も使用できる。
function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。
そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec
"r\nP")
は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。