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メソッドが存在するものの、プライマリメソッドが存在しない場合は、エラーが発せられます。