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