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

46
X 3012 : 1998 (ISO/IEC 13816 : 1997)
する。
・ : beforeメソッドとは,キーワード: beforeを修飾子としてもつメソッドとする。: beforeメソッドは,
主メソッドの前に実行されるコードを指定する。
・ : afterメソッドとは,キーワード: afterを修飾子としてもつメソッドとする。: afterメソッドは,主メ
ソッドの後に実行されるコードを指定する。
・ : aroundメソッドは,キーワード: aroundを修飾子としてもつメソッドとする。: aroundメソッドは,
他の適用可能メソッドの代わりに実行されるコードを指定するが,それらの適用可能メソッドを起動
することもできる。
標準メソッド組合せの意味は,次のとおりとする。
・ : aroundメソッドがある場合,最も優先度の高い: aroundメソッドが呼び出される。このメソッドの値
が包括関数の値となる。
・ : aroundメソッドの本体の中では,call-next-methodを用いて次メソッドを呼び出すことができる。次
メソッドが戻ると,: aroundメソッドは,その返り値に基づいて更にコードを実行できる。
call-next-methodが使用されたとき,適用可能なメソッドがない場合は,エラーが発生する。
next-method-pを用いて,次メソッドの有無を判定できる。
・ : aroundメソッドがcall-next-methodを起動した場合,優先度が次に最も高い: aroundメソッドが適用可
能であれば,それが呼び出される。: aroundメソッドがない場合,又は最も優先度の低い: aroundメソ
ッドからcall-next-methodが呼び出された場合,他のメソッドが次のように呼び出される。
・ すべての: beforeメソッドが,優先度の高いものから順に呼び出される。それらの返り値は無視される。
call-next-methodを: beforeメソッドの中で使用した場合は,エラーが発生する。
・ 最も優先度の高い主メソッドが呼び出される。その主メソッドの本体の中では,call-next-methodを用
いて,優先度が次に最も高い主メソッドを呼び出すことができる。そのメソッドが戻ると,元の主メ
ソッドは,その返り値に基づいて更にコードを実行できる。call-next-methodが使用され,適用可能な
主メソッドがそれ以上存在しない場合は,エラーが発生する。関数next-method-pを用いて,次メソッ
ドの有無を判定できる。call-next-methodが使用されない場合は,優先度の最も高い主メソッドだけが
呼び出される。
・ すべての: afterメソッドが,優先度の低いものから順に呼び出される。それらの返り値は無視される。
call-next-methodが:afterメソッドの中で使用された場合は,エラーが発生する。
・ : aroundメソッドが起動されなかった場合,優先度の最も高い主メソッドの値が包括関数の返す値と
なる。なお,優先度の最も低い: aroundメソッド中でのcall-next-methodの呼出しが返す値は,優先度
の最も高い主メソッドの返す値となる。
標準メソッド組合せを用いる場合,適用可能な主メソッドがない場合は,エラーが発生する。: beforeメ
ソッドは優先度の最も高いものから順に実行され,: afterメソッドは優先度の最も低いものから順に実行
される。この相違の理由を,例によって示す。クラスC1がその上位クラスC2の振る舞いを,: before及び:
afterメソッドを追加することで,変更したとする。クラスC2の振る舞いが,C2のメソッドによって直接
定義されているか上位クラスから継承されているかは,クラスC1のインスタンスに対するメソッド起動の
相対的順序に影響を与えない。クラスC1の: beforeメソッドは,クラスC2のすべてのメソッドよりも前に
実行される。クラスC1の: afterメソッドは,クラスC2のすべてのメソッドよりも後に実行される。
一方,すべての: aroundメソッドは,: aroundメソッド以外のどのメソッドよりも先に実行される。この
ため,より優先度の低い: aroundメソッドが,より優先度の高い主メソッドよりも先に実行される。

――――― [JIS X 3012 pdf 51] ―――――

                                                                                             47
X 3012 : 1998 (ISO/IEC 13816 : 1997)
主メソッドだけが用いられ,かつcall-next-methodが用いられなかった場合,優先度の最も高い主メソッ
ドだけが起動される。つまり,優先度の高い主メソッドは,優先度の低い主メソッドを遮へいする。

7.3.4 次メソッド及びその呼出し

 (call-next-method) →<object>                                                        局所関数
関数call-next-methodは,メソッドの中で次メソッドを呼び出すために使われる。呼び出した次メソッド
の返り値が,この関数の値となる。call-next-methodが戻ると,その呼出し以降の計算を続けることができ
る。
どのメソッドがcall-next-methodを呼び出せるか,またどのメソッドが呼び出されるかは,メソッド組合
せの方法によって決定される。
単純メソッド組合せの場合,次メソッドとは,優先度が次に最も高いメソッドとする。
標準メソッド組合せ方法の場合,主メソッド及び: aroundメソッドの中で,call-next-methodを使うこと
ができる。このとき,次メソッドは,7.3.3.2で定義したとおりとする。
call-next-methodは,現在のメソッドに渡された引数をそのまま次メソッドに渡す。メソッドのパラメタ
に対してsetqを用いたり,パラメタと同じ名前の変数を再束縛しても,call-next-methodが渡す引数には影
響を与えない。
call-next-methodの関数束縛は,メソッドの本体における静的束縛とする。すなわち,labelsによって設
定されたかのように見える。この束縛の関数オブジェクトは,無制限の存在期間をもつ。
call-next-methodが,それを許さないメソッド中で使用された場合は,エラーが発生する。
call-next-methodが実行され,次メソッドがない場合は,エラーが発生する。
(next-method-p) →真偽値 局所関数
関数next-method-pは,メソッドの本体内で,次メソッドの有無を判定するために使われる。この関数は,
次メソッドが存在する場合はtを返し,それ以外の場合はnilを返す。
next-method-pの関数束縛は,メソッドの本体における静的束縛とする。すなわち,labelsによって設定
されたかのように見える。この束縛が参照する関数オブジェクトは,無制限の存在期間をもつ。

7.4 オブジェクトの生成及び初期化

 (create class [{initarg initval}] *) →<object>                                        包括関数
関数createは,新しいオブジェクトを生成して返す。そのオブジェクトは,指定されたクラスのインス
タンスとする。第1引数は,クラスオブジェクトでなければならない。
新しいインスタンスの初期化は,インスタンスのための記憶領域の割当て,スロットへの値の設定,初
期化の追加処理のために利用者が与えたメソッドの実行,という手順からなる。第2と第3の手順は,
initialize-objectという包括関数によって実装されている。これによって,これらの手順を変更することが
可能となる。初期化引数 (initarg) とそれに付随する値 (initval) とが,交互に並んだ一つのリストとして,
initialize-objectに渡される。このリストを初期化リスト (initialization list) と呼ぶ。createは,initialize-object
が初期化した新しいインスタンスを返す。

7.4.1 インスタンスの初期化

 createは,新しく生成したインスタンスを初期化するために,包括関数
initialize-objectを呼び出す。この包括関数は,標準メソッド組合せを用いる。initialize-objectには,利用者
定義のクラスに対するメソッドを定義できる。これによって,システムの提供するスロット設定機構を拡
張したり変更することが可能となる。
初期化においては,すべてのスロットが未束縛である新しいインスタンスが生成され,その後で

――――― [JIS X 3012 pdf 52] ―――――

48
X 3012 : 1998 (ISO/IEC 13816 : 1997)
initialize-objectが呼び出される。
包括関数initialize-objectは,新しいインスタンス及び初期化リストを引数として,呼び出される。
initialize-objectは,システムが提供する主メソッドをもつ。このメソッドのパラメタ特殊化指定は,クラ
ス<standard-object>とする。このメソッドは,与えられた初期化リスト及び各スロットに対する: initform任
意機能に従って,次のとおりスロットを設定する。
・ そのスロットが既に値をもっていれば,その値は変更しない。
・ そのスロットに対する初期化引数と初期値との組が初期化リスト中にある場合,その初期値によって
スロットを初期化する。スロットに対する初期化引数の名前は,defclass中の: initarg任意機能によっ
て宣言される。
・ そのスロットが省略時初期値形式(defclass参照)をもつ場合,その評価形式が定義された静的環境及
び現在の動的環境の下で,それを評価する。評価の結果が,スロットの値となる。
・ 上のいずれでもない場合,スロットは初期化されない。
(initialize-object instance initialization-list) →<object> 包括関数
包括関数initialize-objectは,新しく生成されたインスタンスを初期化するためにcreateから呼び出され
る。包括関数initialize-objectは,新しいインスタンス及び初期化リストを引数とする。
initialize-objectに対しシステムが提供する主メソッドは,initialization-list及びスロットの: initform任意機
能に従って,インスタンスのスロットを初期化する。
引数instanceは,初期化されるインスタンスとする。初期化されたインスタンスが結果として返される。
利用者は,インスタンスの初期化時の動作を指定するため,initialize-objectに対してメソッドを定義でき
る。
: afterメソッドだけが定義された場合,それらのメソッドは,システムの提供する初期化用の主メソッ
ドの後に実行される。したがって,それらのメソッドは,initialize-objectの元々の動作に対して影響を与
えない。利用者がこの包括関数に対して定義した主メソッド又は: aroundメソッドがinstanceを返さない場
合は,結果は未定義とする。

7.5 クラスに関する問合せ

 (class-of obj) →<class>                                                                 関数
関数class-ofは,与えられたobjを直接インスタンスとするクラスを返す。objは,いかなるISLISPオブ
ジェクトでもよい。
(instancep obj class) →真偽値 関数
関数instancepは,objがクラスclassの(直接あるいはそれ以外の)インスタンスである場合はtを返し,
それ以外の場合はnilを返す。objは,いかなるISLISPオブジェクトでもよい。classがクラスオブジェク
トでない場合は,エラーが発生する(エラー名domain-error)。
(subclassp class1 class2) →真偽値 関数
関数subclasspは,クラスclass1がクラスclass2の下位クラスである場合はtを返し,それ以外の場合は
nilを返す。class1又はclass2のいずれかがクラスオブジェクトでない場合は,エラーが発生する(エラー
名domain-error)。
(class class-name) →<class> 特殊演算子
この特殊形式は,class-nameという名前のクラスオブジェクトを返す。

――――― [JIS X 3012 pdf 53] ―――――

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

8. マクロ

 マクロ機能は,言語を構文的に拡張する。マクロは,表層的変換を抽象化したものとする。
ISLISPテキスト(例えば,関数定義)は,内部的にはISLISPのオブジェクトによって表現できるので,
この表層的変換は,リスト処理によって記述できる。評価形式はコンス又は他のオブジェクトで表され,
個々のマクロはあるオブジェクトのグループから他のグループヘの変換関数を記述する。
マクロは,あるオブジェクトのグループから他のグループへの変換を実装する展開関数 (expander
function) によって内部的に定義される。展開関数の操作は,defmacro形式によって指定する。
展開関数は,引数として一つの評価形式を受け取り,異なる評価形式を値として返す。展開関数は主な
役割として,入れ子になったリスト集合を生成する。このために,逆引用符機能を用意している。
マクロは,実行準備時に展開される。いかなる実行時情報も使えない。使用可能な操作は,単純なデー
タ構造の生成及び処理に制限される。すなわち,(端末への入出力のような)環境への副作用,(記号の属
性リスト変更のような)外部的にアクセスできるデータ構造への副作用,及びマクロ形式自身への副作用
を引き起こす操作は禁止する。
マクロは,最上位でだけ定義できる。マクロは,再定義(すなわち,重複定義)してはならない。マク
ロは,実行準備の段階で,それを使用する前に定義しなければならない。
マクロ形式の展開結果は,他の評価形式となる。展開後の評価形式がマクロ形式である場合は,結果が
マクロ形式でなくなるまで展開される。
最上位形式がマクロ形式のとき,そのマクロ展開結果も,最上位形式とみなす。
マクロ形式は,setf形式の場所指定として使用できる(6.2のsetf参照)。
(defmacro macro-name lambda-list form*) →<symbol> 定義演算子
defmacro形式は,名前の付いたマクロを定義する。マクロ展開関数が呼び出されるとき,マクロ名をも
つ暗黙のブロックは生成されない。macro-nameは識別子であり,その有効範囲は,最上位有効範囲全体と
する。lambda-listの定義は,4.7による。macro-nameの定義位置は,lambda-listの直後とする。
例 (defmacro caar (x) (list 'car (list car x))) ⇒ caar
form→<object> 構文
,form→<object> 構文
,@form→<object> 構文
これらの構文を,それぞれ逆引用符構文 (quasiquote syntax),非引用構文 (unquote syntax) 及び非引用連
結構文 (unquote-splicing syntax) と呼ぶ。
逆引用符構文は,リスト構造を作る。form内に非引用構文又は非引用連結構文のいずれも現れない場合,
逆引用符構文は,quote形式と同様に,引数を評価せずに返す。
非引用構文は,逆引用符構文内だけで有効とする。逆引用符構文内に現れた場合,非引用構文は,その
formを評価し,その結果を逆引用符構文内に非引用構文の代わりとして挿入する。
非引用連結構文も,逆引用符構文内だけで有効な構文とする。逆引用符構文内に現れた場合,非引用連
結構文は,そのformを評価する。評価結果は,リストでなければならない。このリストのすべての要素が,
上位リスト内に非引用連結構文の代わりとして挿入される。
逆引用符構文は入れ子にしてもよい。置換は,入れ子の“深さ”が同じである非引用構文又は非引用連
結構文に対してだけ行われる。入れ子の深さは,逆引用符構文に入ると一つ増加し,非引用構文又は非引
用連結構文に入ると一つ減少する。

――――― [JIS X 3012 pdf 54] ―――――

50
X 3012 : 1998 (ISO/IEC 13816 : 1997)
例 (list ,(+ 1 2) 4)
⇒ (list 3 4)
(let ((name a)) (list name ,name ,name))
⇒ (list name a (quote a))
(a ,(+ 1 2) ,@(create-list 3 x) )
⇒ (a 3 x x x b)
((foo (- 10 3)) ,@(cdr (c)) . ,(car (cons)))
⇒ ((foo 7) . cons)
(a (b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) )
⇒ (a (b , (+ 1 2) ,(foo 4 d) ) )
(let((name1 x)
(name2 y))
(a (b ,,name1 ,,name2 d) ))
⇒ (a (b ,x ,y d) )

9. 宣言及び型変換

 (the class-name form) →<object>                                                   特殊演算子
(assure class-name form) →<object> 特殊演算子
これらの評価形式は,formを評価する。formが戻るならば,その返り値がthe形式又はassure形式の値
として返される。さらに,これらの評価形式は,formの値がclass-name(存在するクラスの名前でなけれ
ばならない。)によって示されたクラスのインスタンスであることを指定する。
the形式では,formの値がclass-nameによって指定されたクラス又はその下位クラスのインスタンスで
ない場合は,結果は未定義とする。assure形式では,formの値がclass-nameによって指定されたクラス又
はその下位クラスのインスタンスでない場合は,エラーが発生する(エラー名domain-error)。
例 (the <integer> 10) ⇒ 10
(the <number> 10) ⇒ 10
(the <float> 10) 結果は未定義とする。
(assure <integer> 10) ⇒ 10
(assure <number> 10) ⇒ 10
(assure <float> 10) エラーが発生する。
(convert obj class-name) →<object> 特殊演算子
convertは,型変換関数 (coercion function) と呼ばれる次のいずれかに従って,オブジェクトobjに対応
するクラスclass-nameのオブジェクトを返す。表は最左列にobj,最上行にclass-nameを示す(クラス名
の<>は,この表では記述上の簡潔さのために省略する。)。

――――― [JIS X 3012 pdf 55] ―――――

次のページ PDF 56

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

  • ISO/IEC 13816:1997(IDT)

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