JIS X 3012:1998 プログラム言語ISLISP | ページ 10

                                                                                             41
X 3012 : 1998 (ISO/IEC 13816 : 1997)

7.1.3 スロット及びスロット任意機能の継承

 クラスCのインスタンス中でアクセス可能なすべてのス
ロット名の集合は,C及びその上位クラスで定義されたスロット名の和集合とする。インスタンスの構造
(structure) とは,そのインスタンス中のすべてのスロット名の集合とする。
最も単純な場合,ある名前のスロットは,C又はその上位クラスのいずれか一つのクラスだけで定義さ
れている。スロットがCの上位クラスで定義されている場合,そのスロットは,継承 (inherit) されている
という。そのスロットの特性は,それを定義しているクラスのスロット指定によって決定される。
一般的には,C及びその上位クラスの複数のクラスにおいて,同じ名前のスロットが定義されている可
能性がある。その場合,その名前のただ一つのスロットだけが,Cのインスタンス中でアクセス可能とな
り,そのスロットの特性は,幾つかのスロット指定を次の規則に従って組み合せることによって決定され
る。
・ あるスロット名に対するすべてのスロット指定は,Cのクラス優先度リスト中の順序に従って,優先
度の高い指定から低い指定の順に並べられる。次で用いるスロット指定の優先度とは,この順序を意
味する。
・ スロットの省略時初期値形式は,: initform任意機能を含むスロット指定のうちで最も優先度の高いス
ロット指定に与えられた省略時初期値形式とする。いずれのスロット指定も: initform任意機能を含ま
ない場合は,そのスロットは省略時初期値形式をもたない。
・ スロットの初期化引数は,: initarg任意機能を含むスロット指定に与えられたすべての初期化引数の和
集合とする。いずれのスロット指定も: initarg任意機能を含まない場合は,そのスロットは初期化引数
をもたない。
: reader,: writer,: accessor及び : boundp任意機能は,メソッドを生成するのであって,スロットの特性
を定義するのではない。これらによって生成されるメソッドは,7.2.3で規定する意味で,継承される。

7.2 包括関数

 包括関数 (generic function) は,呼び出されたときの振る舞いが,引数のクラスによって
決定される。包括関数オブジェクトは,メソッドの集合,ラムダリスト,メソッド組合せの方法及びその
他の情報からなる。メソッドは,包括関数のクラスごとの振る舞い及び操作を定義する。このため,メソ
ッドは,包括関数を特殊化 (specialize) するという。包括関数は,呼び出されると,引数のクラスに基づ
いてメソッド集合の部分集合を実行する。
包括関数は,通常の関数と同様に使用できる。
メソッド (method) は,メソッドの本体,そのメソッドがいつ適用可能かを指定するパラメタ特殊化指
定 (parameter specializer) を含むパラメタ記述の並び,及びメソッド組合せ機能がメソッドを区別するため
に用いる修飾子 (qualifier) の並びからなる。メソッドのそれぞれの必すパラメタは,付随するパラメタ特
殊化指定をもち,それらのパラメタ特殊化指定を満たす引数に対してそのメソッドが起動される。
メソッド組合せ機能は,メソッドの選択,それらを起動する順序及び包括関数の返す値を制御する。
ISLISPでは,標準的なメソッド組合せ方法は定義するが,メソッド組合せの新しい方法を定義するための
機能は規定しない。
通常の関数と同様に,包括関数も引数を受け取り,一連の操作を実行し,値を返す。通常の関数は,そ
れが呼び出されたときに必ず実行される本体のコードをただ一つもつ。包括関数は,本体コードの集合を
もち,その中から空でない部分集合が選択されて実行される。包括関数への引数のクラス及びそのメソッ
ド組合せ方法が,本体コードの選択方法及びそれらの組合せ方法を決定する。
(generic-function-p obj) →真偽値 関数

――――― [JIS X 3012 pdf 46] ―――――

42
X 3012 : 1998 (ISO/IEC 13816 : 1997)
関数generic-function-pは,objが包括関数である場合はtを返し,それ以外の場合はnilを返す。objは,
いかなるISLISPオブジェクトでもよい。

7.2.1 包括関数の定義

 包括関数を明示的に定義するには,defgeneric形式を使用する。defgeneric形式に
は,メソッド組合せの方法などの,包括関数の特性を指定することができる。また,: reader,: writer,: accessor
及び : boundp任意機能によって,defclass形式が暗黙のうちに包括関数を定義することができる。
包括関数に対してメソッドを定義する評価形式は,メソッド定義形式 (method-defining form) と呼ばれ,
これにはdefmethod形式及びdefclass形式がある。メソッドは,defgeneric形式によっても定義できるが,
この規格では,defgeneric形式はメソッド定義形式に含めない。
実行準備においては,defmethod形式は,特殊化しようとする包括関数のdefgeneric形式より後になけれ
ばならない。ただし,defclass形式が定義する : readerメソッド,: writerメソッド,: accessorメソッド及
び : boundpメソッドに対しては,対応する包括関数を定義するdefgeneric形式を与える必要はない。
(defgeneric func-spec lambda-list [{option | method-desc}]*) →<object> 定義演算子
ここで,
func-spec ::= identifier | (setf identifier)
lambda-list ::= (var* [&rest var]) |
(var* [: rest var])
option ::= (: method-combination [{identifier | keyword}]) |
(: generic-function-class class-name)
method-desc ::= (: method method-qualifier* parameter-profile form*)
method-qualifier ::= identifier | keyword
parameter-profile ::= ([{var | (var parameter-specializer-name)}]* [[{&rest | : rest}] var])
parameter-specializer-name::= class-name
class-name ::= identifier
var ::= identifier
defgeneric形式は,包括関数を定義するために用いる。この定義形式は,包括関数名func-specを返す。
包括関数名func-specにおける識別子identifierの有効範囲は,最上位有効範囲全体とする。
引数lambda-listは,4.7による。
引数optionは,次のいずれかの任意機能とする。それぞれの任意機能は,高々1回しか指定してはなら
ない。
・ : method-combination任意機能は,メソッド組合せ方法の名前である記号又はキーワードを指定する。
組込みのメソッド組合せ方法の名前には,nil及びstandardがある。
・ : generic-function-class任意機能は,システムの提供する省略時クラス<standard-generic-function>以外の
クラスに包括関数が属することを指定する。引数class-nameは,包括関数のクラスになりうるクラス
の名前とする。
引数method-descは,メソッド記述 (method description) と呼ばれ,包括関数に属するメソッドを,
defmethodによって定義したかのように定義する。メソッド記述中の引数method-qualifier及び
parameter-profileは,defmethodのそれと同じとする。引数form*は,メソッドの本体を指定する。
メソッド記述が指定されない場合,メソッドをもたない包括関数が生成される。包括関数が呼び出され,
適用するメソッドがない場合は,エラーが発生する。

――――― [JIS X 3012 pdf 47] ―――――

                                                                                             43
X 3012 : 1998 (ISO/IEC 13816 : 1997)
defgenericの引数lambda-listは,この包括関数に対するメソッドのパラメタ記述の形を指定する。包括
関数のすべてのメソッドは,このlambda-listと合同なパラメタ記述をもたなければならない。ここでの合
同の定義は,7.2.2.2による。
処理系は,これ以外に,処理系定義の任意機能を含むようにdefgenericを拡張してもよい。

7.2.2 包括関数に対するメソッド定義

 (defmethod func-spec method-qualifier* parameter-profile form*) →<object>         定義演算子
ここで,
func-spec ::= identifier | (setf identifier)
method-qualifier ::= identifier | keyword
parameter-profile ::= ([{var | (var parameter-specializer-name)}]* [[{&rest | : rest}] var])
parameter-specializer-name::= class-name
class-name ::= identifier
var ::= identifier
defmethod定義形式は,包括関数のメソッドを定義し,包括関数名func-specを返す。
メソッド定義形式は,包括関数に対する引数によってそのメソッドが起動されたときに,実行すべきコ
ードを含む。
メソッド定義形式の実行準備によって,次のいずれかが起こる。
・ func-specが既存の包括関数の名前であり,この包括関数がパラメタ特殊化指定及び修飾子に関して,
新たに定義しようとしているメソッドと合致するメソッドを含んでいる場合は,違反とする。パラメ
タ特殊化指定及び修飾子の合致の定義は,7.2.2.1による。
・ func-specが既存の包括関数の名前であり,この包括関数がパラメタ特殊化指定及び修飾子に関して新
たに定義しようとしているメソッドと合致するメソッドを含まない場合,新しいメソッドがこの包括
関数に追加される。
・ defmethod定義形式が,包括関数でない関数の名前func-specの有効範囲に入っている場合は,違反と
する。
・ func-specという名前の包括関数が,最上位有効範囲で定義されていない場合は,違反とする。さらに,
func-specに対するdefgeneric形式が,実行準備しようとしているそのテキスト上で,メソッド定義形
式よりも前にない場合は,違反とする。ただし,そのメソッド定義形式がdefclassである場合を除く。
定義されるメソッドのパラメタ記述は,包括関数のラムダリストと合同でなければならない。ここでの
合同の定義は,7.2.2.2による。
引数method-qualifierは,メソッド修飾子と呼ばれ,メソッド組合せは,これをメソッドに対する属性と
して用いる。メソッド修飾子は,nil以外の記号又はキーワードとする。メソッド修飾子として許されるも
のは,包括関数のメソッド組合せ方法によって,更に制限される。単純メソッド組合せ方法の場合は,修
飾なしメソッドだけが許される。標準メソッド組合せ方法の場合は,修飾なしメソッド,又は: before,: after
及び: aroundのキーワードのうちのいずれか一つだけを修飾子としてもつメソッドが許される。
引数parameter-profileは,パラメタ記述 (parameter profile) と呼ばれ,通常の関数のラムダリストと似て
いるが,必すパラメタの名前を特殊化されたパラメタ (specialized parameter) で置き換えられる点が異なる。
特殊化されたパラメタとは, (var parameter-specializer-name) の形のリストとする。必すパラメタだけが
特殊化できる。パラメタ特殊化指定の名前parameter-specializer-nameは,クラス名を表す識別子とする。

――――― [JIS X 3012 pdf 48] ―――――

44
X 3012 : 1998 (ISO/IEC 13816 : 1997)
必すパラメタに対して,パラメタ特殊化指定名が指定されていない場合,パラメタ特殊化指定として,識
別子<object>が省略されたものとする。
引数form*は,メソッドの本体を指定する。
パラメタ特殊化指定及び修飾子に関して合致する二つのメソッドを,同じ包括関数に対して定義しては
ならない。ここでの合致の定義は,7.2.2.1による。
メソッドは関数ではなく,関数として呼び出すことはできない。

7.2.2.1 パラメタ特殊化指定及び修飾子に関する合致

 次の条件がすべて成り立つとき,二つのメソッド
は,パラメタ特殊化指定及び修飾子に関して合致するという。
a) 二つのメソッドが,同じ個数の必すパラメタをもつ。ここで,二つのメソッドのパラメタ特殊化指定
を,P1,...,Pn及びQ1,...,Qnとする。
b) 1 i nであるすべてのiについてPiとQiとが合致する。パラメタ特殊化指定PiとQiとは,それぞれ
が同じクラスを指す場合に合致する。それ以外の場合,PiとQiとは合致しない。
c) 両方のメソッドに修飾子がある場合に,それらが一致する。
ここで,パラメタ特殊化指定は,パラメタ記述から得られる(defmethod参照)。

7.2.2.2 包括関数のラムダリストとメソッドのパラメタ記述との合同

 ある包括関数のラムダリストと
そのメソッドのパラメタ記述とは,次の二つの条件を満たすときに合同であるという。
a) 両方が,同じ個数の必すパラメタをもつ。
b) 一方が&rest又は : restを含む場合,他方も&rest又は : restを含む。

7.2.3 メソッドの継承

 下位クラスは,次の意味でメソッドを継承する。あるクラスのすべてのインスタ
ンスに対して適用可能なメソッドは,そのクラスの下位クラスのすべてのインスタンスに対しても適用可
能となる。下位クラスのインスタンスは,上位クラスのインスタンスでもあるからである。
メソッドは,それがdefmethod形式によって生成されたものか,defclass形式の任意機能によって自動生
成されたものかに関係なく,全く同様に継承される。

7.3 包括関数の呼出し

 包括関数がある引数とともに呼び出されると,まず実行するコードを決定する。
このコードは,与えられた引数に対する実効メソッド (effective method) と呼ばれる。実効メソッドは,そ
の包括関数中の適用可能メソッドの一部又はすべての組合せとする。包括関数が呼び出され,適用可能な
メソッドがない場合は,エラーが発生する。
実効メソッドが決定されると,包括関数に渡された引数がそのまま渡されて実効メソッドが起動される。
それが返す値が,包括関数の値として返される。
実効メソッドは,次の3段階の手続によって決定される。
a) 適用可能なメソッドを選択する。
b) 適用可能なメソッドを,優先順位に従って,優先度の高いメソッドから低いメソッドの順に並べる。
c) 適用可能なメソッドを,メソッド組合せ方法に従って適用する。

7.3.1 適用可能なメソッドの選択

 ある包括関数及びそれへの引数が与えられたとき,適用可能なメソッ
ド (applicable method) とは,その包括関数のメソッドであり,そのすべてのパラメタ特殊化指定が対応す
る引数によって満たされるメソッドとする。メソッドが適用可能であること及び引数がパラメタ特殊化指
定を満たすことの定義を次に示す。
A1,...,Anを,包括関数への必すパラメタに対応する引数とする。P1,...,Pnを,メソッドMの必すパ
ラメタに対応するパラメタ特殊化指定とする。すべてのAiがPiを満たす (satisfy) とき,メソッドMは適
用可能 (applicable) であるという。AiがクラスCの直接インスタンスとするとき,CがPi及びその下位ク

――――― [JIS X 3012 pdf 49] ―――――

                                                                                             45
X 3012 : 1998 (ISO/IEC 13816 : 1997)
ラスのいずれかである場合に,AiはPiを満たすという。
すべてのパラメタ特殊化指定がクラス<object>となっているメソッドを,省略時メソッド (default
method) と呼ぶ。これは常に適用可能なメソッドであるが,優先度の高いメソッドによって遮へいされる
ことがある。
メソッドは修飾子 (qualifier) をもっことができ,これによってメソッド組合せの際に,メソッドを区別
することができる。一つ以上の修飾子をもつメソッドを,修飾付きメソッド (qualified method) と呼ぶ。修
飾子をもたないメソッドを,修飾なしメソッド (unqualified method) と呼ぶ。

7.3.2 適用可能メソッドの優先順位

 二つのメソッドの優先順位を決定するために,それらのパラメタ特
殊化指定が左から右に順に比較される。
二つのメソッドの,対応するパラメタ特殊化指定が比較される。パラメタ特殊化指定が等しい場合は,
その次が比較される。すべての対応するパラメタ特殊化指定が等しい場合,二つのメソッドは異なる修飾
子をもつはずなので,修飾子を比較することによって,それらのメソッド間に優先順位をつけることがで
きる。
ある対応するパラメタ特殊化指定が等しくなかった場合,それらに対応する引数のクラスのクラス優先
度リストを調べ,その中に先に現れるパラメタ特殊化指定をもつメソッドを,優先度の高いメソッドとす
る。そのクラス優先度リストに,両方のパラメタ特殊化指定が現れることは,適用可能なメソッドの選択
方法が保証する。
この結果として生成される適用可能メソッドのリストは,優先度の最も高いメソッドが最初に,最も低
いメソッドが最後に現れる。

7.3.3 メソッドの適用

 一般的に,実効メソッドは,適用可能メソッドの組合せとなる。実効メソッドは,
適用可能メソッドの一部又はすべてを呼び出し,包括関数の値となる値を返す。また,幾つかのメソッド
がcall-next-methodによってアクセスできるようにする。実効メソッドの本体とは,これらを行う評価形式
であり,これに適切なラムダリストが付加され,関数となる。
実効メソッドの中の各メソッドの役割は,そのメソッド修飾子及びメソッドの優先順位によって決定さ
れる。メソッド修飾子は,メソッドに対する印であり,修飾子の意味は,メソッド組合せの際にこれらの
印がどのように用いられるかによって決まる。適用可能メソッドが,メソッド組合せ方法が認識できない
修飾子をもつ場合は,エラーが発生する。
ISLISPには,二つのメソッド組合せ方法がある。defgeneric形式の: method-combination任意機能に対し
て,nil又はstandardを指定することによって,どちらのメソッド組合せ方法を使うかを指定できる。

7.3.3.1 単純メソッド組合せ

 メソッド組合せ方法の名前がnilの場合は,単純メソッド組合せ (simple
method combination) が使用される。この場合,実効メソッドは,すべての適用可能メソッドのうち,最も
優先度の高いメソッドを呼び出す。呼び出されたメソッドでは,優先度が次に最も高いメソッドを
call-next-methodを用いて呼び出すことができる。call-next-methodが呼び出すメソッドを,次メソッド (next
method) と呼ぶ。述語next-method-pは,次メソッドの有無を判定する。call-next-methodが呼び出され,次
メソッドが存在しない場合は,エラーが発生する。

7.3.3.2 標準メソッド組合せ

 メソッド組合せ方法が指定されていない場合,又はメソッド組合せ方法の
名前としてstandardが指定された場合は,標準メソッド組合せ (standard method combination) が用いられる。
主メソッド (primary method) は,実効メソッドの主要な動作を定義する。補助メソッド (auxiliary
method) は,主メソッドの動作を3通りの方法で修正する。主メソッドとはメソッド修飾子をもたないメ
ソッドとし,補助メソッドとはメソッド修飾子が: before,: after又は: aroundのいずれかであるメソッドと

――――― [JIS X 3012 pdf 50] ―――――

次のページ PDF 51

JIS X 3012:1998の引用国際規格 ISO 一覧

  • ISO/IEC 13816:1997(IDT)

JIS X 3012:1998の国際規格 ICS 分類一覧