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

36
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(if-error (sqrt (setq i(+ i4)))
(retry))))
⇒ 1.7320508075688772

6.7.2 非局所的脱出におけるデータ整合性の保証

 (unwind-protect form cleanup-form*) →<object>                                     特殊演算子
unwind-protectは,まずformを評価する。cleanup-form*は,formの評価が正常に終了するか又は非局所
的脱出によって終了するかにかかわらず,常に評価される。
formが正常に終了し,値Rを返した場合,すべてのcleanup-formが正常に終了したときには,値Rが
unwind-protectから返される。
formからの非局所的脱出が発生した場合,cleanup-form*が脱出の一部として実行される。この場合,す
べてのcleanup-formが正常に終了すれば,元の非局所的脱出が継続して実行される。
cleanup-form*は左から右に順に評価され,それらの値は破棄される。cleanup-form*の評価が正常に終了
した場合,unwind-protectからの脱出は上のとおり実行される。cleanup-formは,次の制約のもとに
unwind-protectからの非局所的脱出を行ってもよい。
unwmd-protect形式のcleanup-form*の実行中に,既に進行中の他の非局所的脱出によって無効となった脱
出先への非局所的脱出を実行した場合は,エラーが発生する(エラー名control-error)。
備考 ISLISPは対話型デバッガを規定していないので,プログラムによるエラー処理が失敗した場合
にエラー回復が対話的に行われるか,またどのように行われるかは規定しない。しかし,ISLISP
処理系が異常停止しなければ,非局所的脱出の機構(return-from,throw又はgo)が必要に応じ
て使われ,cleanup-formが実行される。
例 (defun foo (x)
(catch duplicates
(unwind-protect (bar x)
(for ((1 x (cdr 1)))
((null 1) unused)
(remove-property (car 1) abel)))))
⇒ foo
(defun bar (1)
(cond ((and (symbolp 1) (property 1 label))
(throw duplicates found))
((symbolp 1) (setf (property 1 label) t))
((bar (car 1)) (bar (cdr 1)))
(t nil))) ⇒ bar
(foo (a b c)) ⇒ t
(property a label) ⇒ nil
(foo (a b a c)) ⇒ found
(property a label) ⇒ nil
(defun test ()

――――― [JIS X 3012 pdf 41] ―――――

                                                                                             37
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(catch outer (test 2))) ⇒ test
(defun test2 ()
(block inner
(test3 (lambda () (return-from inner 7)))))
⇒ test2
(defun test3 (fun)
(unwind-protect (test4) (funcall fun)))
⇒ test3
(defun test4 ()
(throw outer 6)) ⇒ test4
(test) エラーが発生する。
このtestの例では,test4内で実行されたthrowの脱出先は,test内のcatch形式である。test3に
おけるunwind-protectは,制御の移行を横取りし,test2におけるblockからのreturn-fromを実行
しようとする。このblockは,脱出先であるcatch形式の動的存在期間内で設定されているので,
エラーが通知される。

7. オブジェクト指向機能

7.1 クラスの定義

 defclass定義形式は,新しい名前付きクラスを定義する。
クラス定義は,次のものを含む。
・ 新しいクラスの名前。
・ 新しいクラスの直接の上位クラスのリスト。
・ スロット指定 (slot specifier) の集合。それぞれのスロット指定は,そのスロットの名前及び0個以上
のスロット任意機能 (slot option) を含む。一つのスロット任意機能は,一つのスロットだけに対する
指示とする。クラス定義は,同じ名前のスロット指定を二つ以上含んではならない。
・ クラス任意機能 (class option) の集合。それぞれのクラス任意機能は,そのクラス全体に対する指示と
する。
defclass定義形式のスロット任意機能及びクラス任意機能は,次の機構を提供する。
・ スロットの初期値を与える評価形式を指定する機構。インスタンス生成時に,そのスロットの初期値
が明示的に与えられなかった場合は,スロット任意機能で指定した評価形式の値が初期値となる。
・ スロットの値を取り出すメソッド,スロットに値を格納するメソッド及びスロットに値が束縛されて
いるどうかを判定するメソッドが,自動的に生成されることを要求する機構。
・ そのクラスのメタクラスを指定する機構。
・ そのクラスが抽象クラスであるかどうかを指定する機構。
(defclass class-name (sc-name*) (slot-spec*) lass-opt*) →<symbol> 定義演算子
ここで,
class-name ::= identifier
sc-name ::= identifier
slot-spec ::= slot-name | (slot-name slot-opt*)
slot-name ::= identifier

――――― [JIS X 3012 pdf 42] ―――――

38
X 3012 : 1998 (ISO/IEC 13816 : 1997)
slot-opt ::= : reader reader-function-name |
: writer writer-function-name |
: accessor reader-function-name |
: boundp boundp-function-name |
: initform form |
: initarg initarg-name
reader-function-name ::= identifier
writer-function-name ::= identifier
boundp-function-name ::= identifier
initarg-name ::= identifier
class-opt ::= (: metaclass metaclass-name) |
(: abstractp abstract-flag)
metaclass-name ::= identifier
obstract-flag ::= t | nil
defclass定義形式は,実行結果としてclass-nameという名前の記号を返す。
引数class-nameは識別子であり,新しいクラスの名前となる。class-nameの定義位置は,defclass定義形
式の直後とする。
引数sc-nameのそれぞれは,識別子であり,新しいクラスの直接の上位クラスを指定する。新しいクラ
スは,それぞれの上位クラスからスロットを継承し,スロットの : reader,: writer,: accessor及び : boundp
メソッドを継承する。スロットの継承方法は7.1.3において,メソッドの継承方法は7.2.3において規定す
る。同じsc-nameが,上位クラス名として2回以上現れてはならない。sc-nameのうちのいずれか二つが,
<standard-object>及び<object>以外の上位クラスを共通にもつ場合は,違反とする。ただし,<standard-class>
以外のメタクラスが指定された場合を除く。
引数slot-specのそれぞれは,スロットの名前か又はスロット名の後に0個以上のスロット任意機能を伴
ったリストとする。引数slot-nameは,識別子でなければならない。同じスロット名が,二つ以上のslot-spec
に現れてはならない。
次のスロット任意機能が使用できる。
・ : reader任意機能は,そのスロットの値を取り出すために,パラメタ記述 ((x class-name)) を伴った修
飾なしメソッドを,reader-function-nameという名前の包括関数に対して定義することを指示する。引
数reader-function-nameは,識別子でなければならない。: reader任意機能は,一つのスロットに対して
複数回指定してもよい。
・ : writer任意機能は,そのスロットに値を格納するために,パラメタ記述 ((y <object>) (x class-name)) を
伴った修飾なしメソッドを,writer-function-nameという名前の包括関数に対して定義することを指示
する。引数wirter-function-nameは,識別子でなければならない。: writer任意機能は,一つのスロット
に対して複数回指定してもよい。
・ : accessor任意機能は,そのスロットの値を取り出すために,パラメタ記述 ((x class-name)) を伴った
修飾なしメソッドを,reader-function-nameという名前の包括関数に対して定義することを指示する。
さらに,次のような包括関数を(もしなければ)定義する。その包括関数を,第1引数をy,第2引
数をxとして呼び出すことと, (setf (reader-function-name x) ) とが同値となる。その包括関数に対し,
パラメタ記述 ((y <object>) (x class-name)) を伴ったメソッドが定義される。引数reader-function-name

――――― [JIS X 3012 pdf 43] ―――――

                                                                                             39
X 3012 : 1998 (ISO/IEC 13816 : 1997)
は,識別子でなければならない。: accessor任意機能は,一つのスロットに対して複数回指定してもよ
い。
・ : boundp任意機能は,そのスロットが既に束縛されているかどうかを判定するために,パラメタ記述
((x class-name)) を伴った修飾なしメソッドを,boundp-function-nameという名前の包括関数に対して定
義することを指示する。引数boundp-function-nameは,識別子でなければならない。: boundp任意機能
は,一つのスロットに対して複数回指定してもよい。
・ : initform任意機能は,そのスロットの初期化時に用いられる省略時初期値形式 (default initial value
form) を指定する。この任意機能は,一つのスロットに対して高々1回しか指定してはならない。こ
の初期値形式は,スロットを初期化するたびに評価される。スロットの初期化に用いられる識別子の
静的有効範囲は,defclass形式中におけるそれらの識別子の静的有効範囲とする。静的有効範囲は,変
数識別子及び関数識別子の両方に対して適用される。一方,現在の動的束縛としては,create(7.4.1
参照)の実行中に存在しているものが用いられる。
・ : initarg任意機能は,initarg-nameという名前の初期化引数 (initialization argument) を宣言し,この初
期化引数がそのスロットを初期化することを指定する。initialize-objectに渡された初期化リスト(7.4
参照)が,初期化引数及びそれに付随する値を含む場合は,その値が,スロットに格納される。この
場合,スロットに : initform任意機能が指定されていても,省略時初期値形式は,評価されない。初
期化リストがそのような初期化引数を含まない場合,: initform任意機能が指定されていれば,それに
従ってスロットが初期化される。初期化リストが,同じスロットに対する複数の初期化引数を含む場
合は,結果は未定義とする。詳細については,7.4.1による。: initarg任意機能は,同じスロットに対
して複数回指定してもよい。
: reader,: writer及び : accessorのスロット任意機能によって生成されたメソッドを,それぞれ: readerメ
ソッド,: writerメソッド及び: accessorメソッドと呼び,これらのメソッドが属する包括関数をスロットア
クセス関数 (slot accessor) と呼ぶ。: boundp任意機能によって生成されたメソッドを: boundpメソッドと呼
ぶ。
処理系は, (slot-name form) が (slot-name : initform form) の省略形となるようにdefclassの構文を拡張し
てはならない。
引数class-optは,クラス任意機能を指定する。これは,クラス全体に対する指示とする。次のクラス任
意機能が使用できる。
・ : metaclass任意機能は,定義しようとしているクラスが,システムの提供する省略時のメタクラス
<standard-class>とは異なるメタクラスをもつことを指示する。引数metaclass-nameは,メタクラスの
名前とする。: metaclass任意機能は,高々1回しか指定してはならない。<built-in-class>がメタクラス
として指定された場合は,違反とする。
・ : abstractp任意機能は,そのクラスが抽象クラスかどうかを指示する。この任意機能が指定され,かつ
abstract-flagがtの場合,このクラスの直接インスタンスを生成しようとしたとき,createがエラーを
通知する。この任意機能が指定されない場合又はabstract-flagがnilの場合,そのクラスは,抽象クラ
スではない。t及びnil以外のabstract-flagが指定された場合は,違反とする。
標準クラスにおいては,defclassに関して次の規則が成り立たなければならない。
・ defclass定義形式は,それが参照する上位クラス識別子の有効範囲内になければならない。
・ クラスは,そのインスタンスが生成される前に定義されていなければならない。
・ defmethod形式の中で,パラメタ特殊化指定としてclass-nameを使用する場合,そのdefmethod形式は,

――――― [JIS X 3012 pdf 44] ―――――

40
X 3012 : 1998 (ISO/IEC 13816 : 1997)
class-nameの有効範囲内になければならない。すなわち,クラスの名前を用いるdefmethod形式は,
そのクラスを定義するdefclass形式よりもテキスト上で後になければならない。
ISLISP処理系を,これらの規則に適合しない状況にも対処できるように拡張してもよい。そのような拡
張は,処理系定義とする。
スロット任意機能は,上位クラスから下位クラスへ継承されたり,別のスロット記述によって遮へい又
は変更されることがある。しかし,クラス任意機能は,継承されない。スロット及びスロット任意機能の
継承については,7.1.3による。
スロットにスロットアクセス関数が指定されていない場合,そのスロットにはアクセスできない。
クラスを定義する場合,その定義形式の中で,直接の上位クラスを指定する順序が重要となる。新しい
クラスは,局所的優先順位 (local precedence order) をもつ。これは,クラスが並べられたリストであり,
その順序は,最初にその新しいクラス,次に直接の上位クラスをそのdefclass定義形式に指定された順序
で並べたものとする。

7.1.1 クラス優先度リストの決定

 クラスCのクラス優先度リスト (class precedence list) とは,C及びそ
のすべての上位クラスに関する全順序であり,C及びその上位クラスの局所的優先順位と矛盾しないもの
とする。すなわち,それぞれの局所的優先順位の中に現れるクラスは,クラス優先度リストの中に同じ順
序で現れるものとする。
C1,...,Cnを,Cの直接の上位クラスとする。C1,...,Cnは,この順序でCのdefclass定義形式に指定
されているとする。C1,...,Cnのクラス優先度リストを,それぞれP1,...,Pnとする。P○Qを,クラス優
先度リストPとQとを連結したリスト又はクラス優先度リストQの先頭にクラスPを追加したリストと
定義する。このとき,Cのクラス優先度リストは,C○P1○...○Pnから,重複を除去したリストとする。連結
結果のリストに,あるクラスが2回現れた場合には,その左側を除去する。
標準クラスを定義するとき,その直接の上位クラスのもつクラス優先度リストの間に,<standard-object>
及び<object>以外のクラスが共通に含まれている場合は,違反とする。

7.1.2 スロットのアクセス

 defclass定義形式によって生成又は変更されたスロットアクセス関数を用い
て,スロットをアクセスできる。
defclass定義形式には,スロット値の取出し及び格納を行うメソッドを生成するための任意機能を指定で
きる。: reader任意機能を指定した場合,スロットの値を取り出すメソッドが自動的に生成される。ただし,
値を格納するメソッドは生成されない。: writer任意機能を指定した場合,スロットに値を格納するメソッ
ドが自動的に生成される。ただし,値を取り出すメソッドは生成されない。: accessor任意機能を指定した
場合,スロットの値を取り出すメソッド及び値を格納するメソッドが自動的に生成される。
: reader又は : writer任意機能をスロットに指定する場合,生成されるメソッドが属する包括関数の名前
を,直接指定する。: writer任意機能に対して指定した名前が識別子nameの場合,スロットへ値を格納す
るための包括関数の名前は識別子nameであり,この包括関数は,新しい値及びインスタンスという二つ
の引数をこの順序で受け取る。: accessor任意機能に対して指定した名前が識別子nameの場合,スロット
値を取り出す包括関数の名前は識別子nameであり,スロットへの値の格納は, (setf (name instance)
new-value)という構文によって行われる。ここで,instanceはそのスロットをもつインスタンスとし,
new-valueは新しい値とする。
: reader,: writer,: accessor及び : boundpの任意機能を指定することによって生成又は変更される包括関
数は,<standard-generic-function>の直接インスタンスとする。

――――― [JIS X 3012 pdf 45] ―――――

次のページ PDF 46

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

  • ISO/IEC 13816:1997(IDT)

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