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


12.10.1 Primitives to manipulate advices

Macro: add-function where place function &optional props

このマクロはplace(Generalized Variablesを参照してください)に格納された関数に、アドバイスfunctionを追加する手軽な方法です。

whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Advice combinatorsを参照してください。

(通常は名前が-functionで終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができます。placeが単にシンボルの場合、functionplaceのグローバル値に追加されます。place(local symbol)というフォームの場合、symbolはその変数の名前をreturnする式なので、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-argsfilter-returnでは、重要になります。

Macro: remove-function place function

このマクロはplaceに格納された関数から、functionを取り除きます。これは、add-functionを使用して、functionplaceに追加されたときだけ機能します。

functionは、placeに追加された関数にたいして、ラムダ式にたいしても機能するように、equalを使用して比較を試みます。これは追加でplaceに追加された関数のnameプロパティーも比較します。これはequalを使用してラムダ式を比較するより信頼性があります。

Function: advice-function-member-p advice function-def

adviceがすでにfunction-def内にある場合は、非nilをreturnします。上記のremove-functionと同様、実際の関数adviceのかわりに、アドバイス断片(piece of advice)のnameも使用できます。

Function: advice-function-mapc f function-def

function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。

Function: advice-eval-interactive-spec spec

そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec "r\nP")は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。