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

                                                                                             11
X 3012 : 1998 (ISO/IEC 13816 : 1997)
図1 クラス継承

2.3 標準クラス

2.3.1 スロット

 <standard-class>をメタクラスとするオブジェクトは,0個以上の名前付きスロットをも
つ。オブジェクトのスロットは,そのオブジェクトのクラスによって決定される。各スロットは,その値
として一つのオブジェクトを保持できる。スロットの名前は,識別子とする。
あるスロットが値をもたないとき,そのスロットは未束縛 (unbound) であるという。未束縛のスロット

――――― [JIS X 3012 pdf 16] ―――――

12
X 3012 : 1998 (ISO/IEC 13816 : 1997)
の値を取り出そうとした場合は,結果は未定義とする。
スロットの値を格納したり取り出したりすることは,defclass定義形式で定義される包括関数によって行
う。
すべてのスロットは局所的とする。すなわち,複数のインスタンスからアクセスできる共通のスロット
は存在しない。
あるクラスのdefclass定義形式に,ある名前のスロット指定が含まれるとき,そのクラスはその名前の
スロットを定義する (define) という。スロットを定義することは,直ちにスロットを生成することを意味
するのではなく,そのクラスのインスタンスが生成されるごとにスロットが生成されることを意味する。
あるスロットがそのインスタンスの属するクラスによって定義されているか又はそのクラスの上位クラ
スから継承されているとき,そのスロットは,アクセス可能 (accessible) であるという。一つのインスタ
ンスに対しては,ある名前のスロットは,高々一つだけがアクセス可能とする。スロットの継承の詳細は,
7.1.3による。

2.3.2 クラスのインスタンスの生成

 包括関数createは,クラスのインスタンスを生成し,それを値とし
て返す。ISLISPは,インスタンスを初期化する方法を指定するために,幾つかの機構を用意している。例
えば,省略時初期値形式を与えることによって,新しく生成されるインスタンスのスロット初期値を指定
することができる。更に,初期化のための包括関数に対してメソッドを追加することによって,柔軟な初
期化が行える。

3. 有効範囲及び存在期間

 ISLISPを定める上で,有効範囲及び存在期間の概念は重要となる。前者は構
文の概念とし,後者は意味の概念とする。構文上の構造,特に識別子は,実行時の実体(実行中に生成さ
れるオブジェクト)を参照するために使うが,一つの実体が同時に有効範囲及び存在期間の両方をもつこ
とはできない。有効範囲は,識別子の属性であり,識別子が一意的な意味をもつISLISPテキストの一部分
を指す。存在期間は,あるオブジェクトが存在する期間を指す。
名前空間 (namespace) は,識別子から意味への対応を決定する。ISLISPには,六つの名前空間(変数,
動的変数,関数,クラス,ブロック及びタグ本体のタグ)がある。プログラムの文脈に応じて,一つの識
別子が,最大で六つの意味をもつことができる。例えば,関数適用形式において,演算子位置に識別子が
現れた場合,関数の名前空間がその識別子の意味を決定する。一方,同じ評価形式の引数位置に同じ識別
子が現れた場合,変数の名前空間がその識別子の意味を決定する。

3.1 静的原理

 ISLISPは,静的可視性 (lexical visibility) の原理に従って設計されている。この原理は,
ISLISPテキストが,正しく入れ子構造になった静的可視性のブロックから構成されることを意味する。あ
るブロックの中では,そのブロックで定義されたすべての識別子及びそのブロックを包含する外側のブロ
ックで定義されたすべての識別子が可視とする。ある名前空間の識別子は,それを定義する最も内側のブ
ロックによって意味が決まる。
ISLISPは動的束縛 (dynamic binding) の機能も提供する。動的束縛の設定及びアクセスは,専用の機構
(すなわち,defdynamic,dynamic-let及びdynamic)によって行なわれる。動的束縛の値は,時間的に最も
近い時点で実行された活性ブロック (active block) が設定した束縛の値とする。ここで活性ブロックとは,
実行が開始され,その実行がまだ終了していないブロックとする。専用の機構が使われるので,一つの識
別子に,静的な意味及び動的束縛の値の両方が定義されている場所では,それらを同時にアクセスできる。

――――― [JIS X 3012 pdf 17] ―――――

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

3.2 識別子の有効範囲

 識別子の有効範囲 (scope) とは,その識別子の意味が定義されているISLISPテ
キストの一部分とする。有効範囲は,定義位置から始まる。定義位置は,識別子の束縛を設定する評価形
式ごとに定める。識別子だけが有効範囲をもつことができる。
ある名前空間において,ある識別子がsaという有効範囲をもち,同じ名前空間における同じ識別子がsa
の内側に有効範囲sbをもつ場合,sbはsaの一部ではない。このとき,内側の有効範囲は,外側の有効範囲
を遮へいする (shadow) という。
参考 個々の評価形式の記述の中で有効範囲を規定する場合,遮へいされる部分も含んだ範囲を記す
ことにする。
ISLISPテキスト全体は,最上位有効範囲 (toplevel scope) と呼ばれる有効範囲で処理される。
(let ((a1 f-a1)
···
(x f-x)
···
(z1 f-z1))
;ここで,a1,···,x,···,z1が使用でき,それらの有効範囲はここから始まる。
(let((a2 f-a2) ;a1,···,x,···,z1は,新しく定義されるかもしれない。しかし,
··· ;依然,外側のa1,···,x,···.,z1は使用でき,
(x f-x2) ;内側のa2,···,x,···,z2はまだ使用できない。
···
(z2 f-z2));外側のxの有効範囲が,遮へいされる。
;内側のa2,···,x,···,z2の有効範囲が始まる。
··· ;ここで,外側のa1,z1及び内側のa2,···,x,···,z2が使用できる。
) ;ここで,a2,···,x,···,z2の有効範囲が終わる。
··· ;外側のxの有効範囲が復活する。
) ;ここで,a1,···,x,···,z1の有効範囲が終わる。
図2 有効範囲の例

3.3 個別の有効範囲規則

 組込み関数及び組込み定数に対応する識別子の有効範囲は,最上位有効範囲
とする。予約語(1.6参照)は識別子ではないので,静的原理に従わない。予約語は定義できないし,束縛
もできない。

3.4 存在期間

 構文の概念である有効範囲に対して,意味の概念である存在期間 (extent) がある。これ
は,実体が生存する期間を表わす。
オブジェクトは,実行中のある時点で生成される。ほとんどの場合,オブジェクトの存在が終わる時点
は決定できない。オブジェクトの存在期間は,オブジェクトが生成された時点に始まり,それへの参照が
不可能になった時点で終了する。この場合,そのオブジェクトは,無制限の存在期間 (indefinite extent) を
もつという。
その他に,実行準備されたテキストに付随する実体を,処理系が生成する場合がある。そのようなオブ
ジェクトの存在期間は,それを定義する構文の起動時点に始まり,活動が終了した時点で終了する。この
とき,そのオブジェクトは,動的存在期間 (dynamic extent) をもつという。

――――― [JIS X 3012 pdf 18] ―――――

14
X 3012 : 1998 (ISO/IEC 13816 : 1997)
プログラムの実行中に,定義形式及び次の束縛形式は,起動された時点に束縛を行う。
block let with-open-io-file
dynamic-let let* with-open-output-file
flet tagbody with-standard-input
for with-error-output with-standard-output
labels with-open-input-file
定義形式が設定する束縛は,無制限の存在期間をもつ。局所的な束縛を設定する特殊形式においても,
実行終了時点で束縛が消滅するとは限らない。そのブロックの実行中にそれらの束縛をアクセスする関数
オブジェクトが生成された場合,束縛は,それらの関数オブジェクトのうち,存在期間が最大のものと同
じ存在期間をもつ。
例 (defun copy-cell (x) (cons (car x) (cdr x)))
識別子xの有効範囲は,本体,すなわち, (cons (car x) (cdr x)) となる。xの意味は,本体の全
体で定義される。識別子としてのxは,存在期間をもたない。このdefun形式が実行準備され,
copy-cellが実行準備された関数となる。プログラム実行中,実行準備された関数copy-cellが起動
されるかもしれない。この起動によって,xという名前の変数と,引数として使われるオブジェ
クトとの間に,束縛が生成される。Xの束縛の存在期間は,関数の起動時点に始まり,関数の終
了時点に終わる(一般には,束縛は関数の活動終了後も存在し続ける可能性があるが,この単純
な例では,そのようなことは起こらない。)。xの束縛は関数起動時点に設定 (establish) されると
いい,活動終了時点に解除 (disestablish) されるという。

4. 評価形式及び評価

4.1 評価形式

 ISLISPテキストの実行準備が成功していることを前提として,実行が行われる。実行と
は,実行準備された評価形式の活動であり,その結果,値を生成し,副作用を生じることもある。
ISLISPテキストとは,評価形式の並びとする。
この規格では,評価形式が返す値を定めているが,評価形式の部分形式が非局所的脱出(6.7.1参照)を
実行する場合には,戻らないこともある。それゆえ,すべての値の記述は,戻るという条件が存在するこ
とを暗黙の前提とする。
次のものを,ISLISPの正しい評価形式とする。
・ 複合形式 (compound form)
− 特殊形式 (special form)
− 定義形式 (defining form)
− 関数適用形式 (function application form)
− マクロ形式 (macro form)
・ 識別子 (identifier)
・ リテラル (literal)
評価形式は,評価されると,一つのオブジェクトをその値として返す。ただし,戻らない評価形式(例
えば,return-from)もある。
複合形式は, (operator argument*) と記述される。operatorは,特殊演算子,定義演算子,識別子又はラ
ムダ式でなければならない。識別子は,関数(包括関数を含む。)又はマクロの名前でなければならない。

――――― [JIS X 3012 pdf 19] ―――――

                                                                                             15
X 3012 : 1998 (ISO/IEC 13816 : 1997)
operatorがリテラルの場合は,違反とする。
最上位形式 (toplevel form) とは,他の評価形式に構文上含まれることがないか,又は一つ以上のprogn
形式の中にだけ入れ子になった評価形式とする。最上位に現れる特殊形式及び関数適用形式を,初期設定
形式 (set-up form) と呼ぶ。定義形式が最上位形式でない場合は,違反とする。

4.2 関数適用形式

 関数適用形式 (function application form) は,演算子が関数の名前を与える識別子で
あるか又は演算子がラムダ式である複合形式とする。すべての引数は左から右に順に評価され,その後に
それらの引数で関数が呼び出される。これを適用する (apply) という。関数の適用において,引数は,評
価の結果であるオブジェクトが評価と同じ順序で使われる。
この規格では,関数適用形式を次の記法を使って記述する。
(function-name argument*) →結果のクラス 関数
これは,通常の関数(包括関数以外の関数)を記述する。
(generic-function-name argument*) →結果のクラス 包括関数
これは,包括関数を記述する。
(local-function-name argument*) →結果のクラス 局所関数
これは,指定された静的有効範囲だけで利用できる通常の関数を記述する。

4.3 特殊形式

 特殊形式 (special form) とは,その引数が特別な方法で扱われる評価形式とする。例えば,
引数が評価されなかったり,特殊な順序で評価されたりする。ある特殊形式がマクロ(4.5及び8.参照)で
記述されるかどうかは,処理系定義とする。特殊形式は,その演算子位置に特殊演算子 (special operator) が
あることで判別できる。次のものを,特殊演算子とする。
and dynamic-let let* unwind-protect
assure flet or while
block for progn with-error-output
case function quote with-handler
case-using go return-from with-open-input-file
catch if setf with-open-io-file
class ignore-errors setq with-open-output-file
cond labels tagbody with-standard-input
convert lambda the with-standard-output
dynamic let throw
これ以外にも,処理系定義の特殊演算子がある場合もある。
この規格では,次の表記で特殊形式を記述する。
(special-operator argument*) →結果のクラス 特殊演算子

4.4 定義形式

 定義形式 (defining form) は,名前nameとオブジェクトとの束縛を設定する最上位形式
(4.1参照)とする。この束縛は,定義形式の名前defining-form-nameごとに定められた意味に基づいて,
argumentを操作した結果として設定される。定義形式が最上位形式でない場合は,違反とする。それぞれ
の名前空間において,定義形式は同じ名前に対して2回以上現れてはならない。ただし,メソッド定義の
場合は,名前だけでなくパラメタ記述についても同じものが,2回以上現れてはならない。定義形式は,
その演算子が定義演算子 (defining operator) である複合形式とする。次のものを,定義演算子とする。
defclass defdynamic defglobal defmethod

――――― [JIS X 3012 pdf 20] ―――――

次のページ PDF 21

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

  • ISO/IEC 13816:1997(IDT)

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