[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ジェネリック関数を生成し、name に束縛します。
通常は、これを使う必要はありません。もし、まだ存在していなければ、
define-method
マクロが暗黙裏にジェネリック関数を生成してくれるからです。
キーワード引数class
に、<generic>
のサブクラスを渡すことで、
作られるジェネリック関数をデフォルトの<generic>
クラスのインスタンスでは
なく指定のクラスのインスタンスにすることができます。<generic>
の
サブクラスを定義してメソッド適用をカスタマイズする場合に便利です。
name という名前のメソッドを定義します。すでにグローバルに name に束縛されているジェネリック関数オブジェクトが存在していれば、生成された メソッドはそのジェネリック関数に追加されます。name が未束縛であるか またはジェネリック関数以外に束縛されているなら、新しいジェネリック関数が 生成され、name に束縛されて、新しいメソッドがそれに追加されます。
specs はこのメソッドに対応する引数とその型を指定します。これは lambda 形式の引数リストに似ていますが、それぞれの引数の型を指定できる ところが違います。
specs : ( arg … ) | ( arg … . symbol ) | symbol arg : ( symbol class ) | symbol |
class は引数が所属すべきクラスを指定します。arg
が単に
シンボルであれば、(arg <top>)
と同じです。rest 引数の
型を指定することはできません。それは常にリストに束縛されるからです。
引数リストのクラスのリストはメソッド特定化子リストといい、 これを基に、ジェネリック関数は適切なメソッドを選択します。specs と それに対応する特定化子リストの例をあげておきます。
specs: ((self <myclass>) (index <integer>) value) specializers: (<myclas> <integer> <top>) specs: ((self <myclass>) obj . options) specializers: (<myclas> <top> . <top>) specs: (obj (attr <string>)) specializers: (<top> <string>) specs: args specializers: <top> |
その特定化子リストがジェネリック関数の中のメソッドの一つに一致するような name 上のメソッドを定義すると、既存のメソッドは新しく定義された メソッドに置き換えられます。
ジェネリック関数は適用されると、まず、与えられた引数に適合する
特定化子リストを持つメソッドを選択します。たとえば、ジェネリック関数
foo
が 3つのメソッドを持っており、それらの特定化子リストが
それぞれ、(<string> <top>)
、(<string> <string>)
、
(<top> <top>)
であるとします。foo
が (foo "abc" 3)
の
ように適用されたとき、最初と 3番目のメソッドが選択されます。
選択されたメソッドは、もっとも特定化されたものから、もっとも一般的なものへ の順でソートされます。これは以下のように計算されます。
(A1 A2 …)
という特定化子リストをもつメソッド a
と
(B1 B2 …)
という特定化子リストをもつメソッド b
とが
あるとします。
An
と Bn
とが異る最小の n を見つけます。n 番目の
引数のクラスをとり、そのクラスの順位リストをチェックします。もし、
その CPL の中で、An
が Bn
より先にくれば、method a
は
メソッド b
より特定化されているということにし、さもなければ、
b
が a
がより特定化されているということにします。
a
および b
のすべての特定化子が、一方は rest 引数
をもち、もう一方はもたないという以外同じであれば、rest 引数をもたない
メソッドのほうがそうでないものより特定化されているとします。
メソッドがソートされたら、最初のメソッドの本体が実引数で呼ばれます。
メソッド本体内部では、特別なローカル変数 next-method
が暗黙裏に
束縛されます。
この変数は、メソッド本体内部で、ソートされたメソッドリストで次のメソッド をカプセル化した特別なオブジェクトに束縛されます。
引数なしで呼ぶと、次のメソッドがこのメソッドよばれたときとと同じ引数で 起動されます。args … を明示的にわたすと、次のメソッドがその 渡された引数で起動されます。
next-method
がもっとも特定化されていないメソッドで呼ばれた場合、
すなわち、「次のメソッド」がない場合、エラーシグナルがあがります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.