7.6.6.4. 組み込みのMethod-Combination
オブジェクトシステムは、組み込みのmethod-combinationタイプをいくつか提供しています。 これらのmethod-combinationタイプのうちの1つを、ジェネリック関数で使うことができます。 指定する方法は、method-combinationタイプの名前を、 defgeneric
の:method-combination
オプションに引数として与えるか、 その他のオペレーターでジェネリック関数の オプション:method-combination
を指定することです。
組み込みのmethod-combinationタイプの名前を、次の表に示します。
+
and
append
list
max
min
nconc
or
progn
standard
表7-2 組み込みのMethod-Combinationタイプ
組み込みのmethod-combinationタイプであるstandard
の意味は、 7.6.6.2. Standard Method-Combinationに記載しました。 他の組み込みmethod-combinationタイプは、 シンプルな組み込みmethod-combinationタイプと呼ばれています。
シンプルなmethod-combinationタイプは、 短い形式のdefine-method-combination
によって定義されたかのように動作します。 メソッドは次の2つの役割を認識します。
around
メソッドは、ただひとつの修飾子として:around
キーワードを持ちます。 around
メソッドの意味はmethod-combinationのstandard
と同じです。 around
メソッド内ではcall-next-method
とnext-method-p
の 関数の使用が提供されます。
プライマリメソッドは、ただひとつの修飾子としてmethod-combinationの名前を持ちます。 例えば、組み込みのmethod-combinationタイプのand
は、 ただひとつの修飾子であるand
を指定したメソッドをプライマリメソッドとして認識します。 call-next-method
とnext-method-p
の関数は プライマリメソッドでは提供されません。
シンプルな組み込みmethod-combinationタイプの意味を下記に示します。
もしaround
メソッドが存在するならば、最も特定的なaround
メソッドが呼ばれます。 これはジェネリック関数へ1つか複数の返却値を提供します。
around
メソッドのコード内では、次のメソッドを呼ぶためのcall-next-method
が使用できます。 もしcall-next-method
を使用したときに、呼び出せる適用可能なメソッドが存在しなかった場合は、 ジェネリック関数no-next-method
が呼び出されます。 関数next-method-p
は、次のメソッドが存在するかどうかを決定するために使われます。 次のメソッドから戻ったとき、around
メソッドは返却された値に基づいて、 さらにコードを実行することができます。
もしaround
メソッドがcall-next-method
を実行したとき、 次の特定的なaround
メソッドが適用可能であれば呼び出されます。 もしaround
メソッドが存在しないか、 あるいは最も遠いaround
メソッドによってcall-next-method
が呼び出されたときは、 組み込みmethod-combinationタイプの名前と適用可能なプライマリメソッドのリストから、 評価されるとジェネリック関数の返却値を生成する様なLispフォームが導出されます。 例えば、method-combinationタイプの名前がoperator
のとき、 ジェネリック関数が次のフォームによって呼び出されることを考えます。
generic-function a1...an) (
ここでM1, ... Mk
はこの順に適用可能なプライマリリストであるとします。 そのとき、Lispフォームは次のように導出されます。
(operator <M1 a1...an> ... <Mk a1...an>)
もし式<Mi a1...an>
が評価されたとき、メソッドMi
は引数a1...an
を適用します。 例えばoperator
がor
のとき、式<Mi a1...an>
は、 ただ<Mj a1...an>
, 1≦j<i
がnil
を返却したときのみに評価されます。
プライマリメソッドのデフォルトの順番は:most-specific-first
です。 しかし、:method-combination
オプションの2番目の引数に :most-specific-last
を指定したときは逆順にすることができます。
シンプルな組み込みmethod-combinationタイプは、 メソッドに対して正確に1つの修飾子を要求します。 もし修飾子が存在しない適用可能なメソッドか、 あるいはmethod-combinationタイプが認識しない修飾子を指定したときはエラーが発せられます。 もしaround
メソッドが存在するものの、プライマリメソッドが存在しない場合は、エラーが発せられます。