7.6.2. メソッドの紹介
メソッドは、クラス特定か、あるいは同一性特定による動作と、 ジェネリック関数のオペレーションを定義します。
メソッドオブジェクトは、次のものと結びつけられます。 それは、メソッドの動作を定義したコード。 与えられたメソッドが適用するかどうかを特定するための一連の特定パラメーター。 ラムダリスト。 そして、method-combinationがメソッドの区分けをするために使われる、一連の修飾子。
メソッドオブジェクトは関数ではないため、関数として呼び出すことはできません。 ジェネリック関数が呼び出されたときのような場合において、 オブジェクトシステムの様々な仕組みがメソッドオブジェクトを受け取り、 そしてメソッド関数を呼び出します。 このような動作を、メソッドが実行された、あるいはメソッドが呼び出されたと言います。
メソッド定義フォームは、 ジェネリック関数の引数起因により定義メソッドを実行するためのコードを含みます。 メソッド定義フォームが評価されたとき、メソッドオブジェクトは作成され、 次の4つのアクションが取られます。
もし指定した名前のジェネリック関数がすでに存在しており、 さらに特定パラメーターと修飾子が 新しいものと一致するメソッドオブジェクトがすでに存在していた場合は、 新しいメソッドオブジェクトが古いものと置き換えられます。 定義されたメソッドが別の特定パラメーターと修飾子の場合は、 7.6.3. 特定パラメーターと修飾子の合致を参照。
もし指定した名前のジェネリック関数がすでに存在しており、 さらに特定パラメーターと修飾子が 新しいものと一致するメソッドオブジェクトが存在していなかった場合は、 既存のジェネリック関数オブジェクトは、 新しいメソッドオブジェクトを含むように修正されます。
もし指定した名前が、通常の関数か、マクロ、特別オペレーターの名前であった場合は、 エラーが発せられます。
それ以外の場合は、メソッド定義フォームによって定義されたメソッドとともに、 ジェネリック関数が作成されます。
もし新しいメソッドのラムダリストがジェネリック関数のラムダリストに合致していない場合は、 エラーが発せられます。 もしジェネリック関数オプションを指定できないメソッド定義オペレーターが 新しいジェネリック関数を作成する場合は、 ジェネリック関数のラムダリストは、メソッドのものと合致するように、 メソッド定義フォームから生成されるメソッドのラムダリストから導出されます。 合致の議論については、7.6.4 ジェネリック関数の全てのメソッドのラムダリストの合意を参照。
各メソッドは特定されたラムダリストを持っており、 それはメソッドが適用されたときに決定します。 特定されたラムダリストは、通常のラムダリストに似ていますが、 要求パラメータの名前の代わりに特定パラメーターとなるのが違っています。 特定パラメーターは(変数名 特定パラメーター名)
のリストであり、 特定パラメーター名は次のうちの1つを取ります。
シンボル:特定パラメーターはシンボルによるクラス名です。
クラス:特定パラメーターはクラス自身です。
(eql form)
:特定パラメーターは型特定子(eql object)
を満たし、 object
はform
を評価した結果となります。 form
フォームはメソッド定義フォームが評価された中での レキシカル環境内によって評価されます。 注意として、form
はメソッドが定義されたときに、ただ一度だけ評価されます。 ジェネリック関数が呼び出されるたびに評価されるのではありません。
特定パラメーター名は、ユーザーレベルのインターフェースである defmethod
のようなマクロで使用されることを意図しており、 特定パラメーターは関数のインターフェース上で使われます。
要求パラメーターのみを特定化することができ、 各要求パラメーターは特定パラメーターが存在しなければなりません。 表記を単純にするために、もしメソッド定義フォームの特定化されたラムダリスト内において、 要求パラメーターが単純に変数名だけであった場合は、 その要求パラメーターはデフォルトのクラスt
が指定されます。
ジェネリック関数に引数の集合が与えられたとき、 適用するメソッドは、特定パラメーターが対応する引数によって満たされる ジェネリック関数のメソッドです。 次の定義は、メソッドが適用可能かどうか、また引数が特定パラメーターを満たすかどうかとは、 どういう意味であるのかを示します。
<A1, ..., An>
がジェネリック関数の要求パラメーターの順番であるとします。 <P1, ..., Pn>
がメソッドM
における要求パラメーターに対応する 特定パラメーターの順番であるとします。 各Ai
の型が、型特定子Pi
によって特定されるとき、メソッドM
は適用可能です。 全ての有効な特定パラメータは有効な型指定子でもあるため、 関数typep
は、メソッドの選択において、 引数が特定パラメーターを満たすかどうかを決定するために使用できます。
全ての特定パラメーターがクラスt
のメソッドは、デフォルトメソッドと呼ばれます。 これは常に適用可能ですが、他のもっと特定的なメソッドによってシャドウされるかもしれません。
メソッドは修飾子を持てます。 これはmethod-combinationがメソッドを区別するための方法としての手順を与えます。 1つか複数の修飾子を持っているメソッドは、限定されたメソッドと呼ばれます。 修飾子を持っていないメソッドは、限定されていないメソッドと呼ばれます。 修飾子はリスト以外のオブジェクトです。 標準のmethod-combinationによって定義された修飾子の型はシンボルです。
この定義の中で、「プライマリメソッド」と「補助メソッド」という語は、 これらを使用するmethod-combinationタイプにおいて、メソッドを区分けするために使用されます。 method-combinationのstandard
では、プライマリメソッドは限定されていないメソッドであり、 補助メソッドは単一の修飾子である:around
, :before
, :after
のうちの1つを指定したメソッドです。 これらのメソッドは、順にaround
メソッド、before
メソッド、after
メソッドと呼びます。 method-combinationタイプがdefine-method-combination
の 短いフォームを使用して定義されたとき、 プライマリメソッドはmethod-combinationタイプの名前を修飾子に与えたメソッドになります。 そして補助メソッドは:around
の修飾子です。 このように「プライマリメソッド」と「補助メソッド」という語は、 method-combinationタイプにおける、ただの相対的な定義となります。