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