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

26
X 3012 : 1998 (ISO/IEC 13816 : 1997)
x ⇒0
(let ((x 1)) ) ⇒1
x ⇒0
(setq var form) →<object> 特殊演算子
setq形式は,識別子varで表される変数への代入を表す。この結果として,formの値が識別子varの値
となる。
setq形式は,引数formを評価した結果を返す。この結果は,識別子varで表される変数束縛を(もし変
更可能ならば)変更するために用いられる。setq形式は,束縛の変更だけに用い,変数束縛の設定に用い
るものではない。setq形式は,defglobal,let,let*,for又はラムダ式で設定される変数varの有効範囲の中
に含まれていなければならない。
例 (defglobal x 2) ⇒x
(+ x 1) ⇒3
(setq x 4) ⇒4
(+ x 1) ⇒5
(let ((x 1)) (setq x 2) x) ⇒2
(+ x 1) ⇒5
(setf place form) →<object> 特殊演算子
setf形式は,一般化された代入に使う。
setf形式は,場所を指定するplaceを受け取り,評価形式formの評価結果をその場所に格納する。評価
形式placeは,全体が評価されるのではなく,結果を格納する場所を決定するために,placeの部分形式が
左から右に順に評価される。placeが識別子で表される場合には,setfはsetqと全く同じ動作をする。setf
形式は,formの評価結果を返す。setf形式の正しい場所指定は,次のとおりとする。
変数 var
動的束縛 (dynamic var)
配列の要素 (aref basic-array z1...zn)
一般配列の要素 (garef general-array z1...zn)
リストの要素 (elt list z)
ベクタの要素 (elt basic-vector z)
コンスのcar要素 (car cons)
コンスのcdr要素 (cdr cons)
記号の属性 (property symbol property)
クラスのインスタンスのスロット (reader-function-name instance)
ここで,reader-function-nameは,: accessor任意機能(7.1参照)に指定した識別子とする。
また,場所指定は,(実行準備の段階で)場所指定に展開されるマクロ形式であるか,setfが定義されて
いる演算子の関数適用形式であるか,又は (setf op) という名前の包括関数が定義されている演算子opの
関数適用形式であってよい。後の二つの場合には,その関数は引数として,代入される新しい値と関数適
用形式の引数を評価して得られたオブジェクトとを受け取る。

――――― [JIS X 3012 pdf 31] ―――――

                                                                                             27
X 3012 : 1998 (ISO/IEC 13816 : 1997)
例 (setf (car x) 2) ⇒2
コンスxにおいて,そのcarは2となる。
(defmacro first (spot)
(car ,spot)) ⇒ first
(setf (first x) 2) ⇒2
コンスxにおいて,そのcarは2となる。
(let ((var form) *) ody-form*) →<object> 特殊演算子
let形式は,一連の評価形式body-form*(まとめてbodyと呼ぶ。)に対して,識別子の有効範囲を定義す
るために使われる。対のリスト (var form)*は,let変数リストと呼ばれる。識別子varの有効範囲は,body
とする。
let変数リスト中の各formは,左から右に順に評価される。そして識別子varで表される各変数は,対応
する値に初期化される。これらの束縛と,既存の束縛とを使って,body-form*が順に評価される。letの返
り値は,本体の最後のbody-formを評価した結果(body-formがない場合は,nil)とする。
同じvarが,let変数リストに2回以上現れてはならない。
備考 この形式は特殊形式であるが,書換え規則が次のように定義されたマクロと考えてもよい。
(let ( ) ody-form*)≡ (progn body-form*) (3)
(let ((var1 form1) ≡ ((lambda (var1 var2 ... varn) ody-form*)
(var2 form2) form1 form2 ... formn) (4)
...
(varn formn))
body-form*)
注(3) rognの定義については,6.5参照。
(4) ambdaの定義については,4.7参照。
例 (let ((x 2) (y 3))
(* x y)) ⇒6
(let ((x 2) (y 3))
(let ((x 7)
(z (+ x y)))
(* z x))) ⇒ 35
(let ((x 1) (y 2))
(let ((x y) (y x))
(list x y))) ⇒ (2 1)
(let* ((var form) *) ody-form*) →<object> 特殊演算子
let*形式は,一連の評価形式body-form*(まとめてbodyと呼ぶ)に対して,識別子の有効範囲を定義す

――――― [JIS X 3012 pdf 32] ―――――

28
X 3012 : 1998 (ISO/IEC 13816 : 1997)
るために使われる。最初の部分形式(let*変数リスト)は,対 (var form) のリストとする。識別子varの有
効範囲は,本体body及びlet*変数リスト中の対 (var form) の後のすべてのformとする。
各対 (var form) に対して次が実行される。その時点で有効な束縛の文脈で,formが評価される。評価結
果は,識別子varを名前とする変数に束縛される。これらの変数束縛は,現在有効な識別子の集合を拡大
する。場合によっては(同じ名前の変数が外側で定義されている場合),以前の変数束縛を遮へいする。そ
して,この拡大又は修正された環境で,body-form*が順に評価される。let*の返り値は,本体の最後の
body-formの評価結果(body-formがなければnil)とする。
備考 この形式は特殊形式であるが,書換え規則が次のように定義されたマクロと考えてもよい。
(let* () ody-form*) ≡ (progn body-form*)
(let* ((var1 form1) ≡ (let ((var1 form1))
(var2 form2) (let ((var2 form2))
... ...
(varn formn)) (let ((varn formn))
body-form*) body-form*)...))
例 (let ((x 2) (y 3))
(let* ((x 7)
(z (+ x y)))
(* z x))) ⇒ 70
(let ((x 1) (y 2))
(let* ((x y) (y x))
(list x y))) ⇒ (2 2)

6.3 動的変数

 動的変数は,動的変数の名前空間における識別子varとISLISPオブジェクトとの結合と
する。動的変数は,動的束縛を実装する。
動的変数は,defdynamicによって大域的に定義されるか,又はdynamic-letの実行によって設定される。
defdynamicで定義された動的変数束縛は無限に存在し続ける。これに対して,dynamic-letで設定された
動的変数束縛は,この特殊形式の実行の終了によって消滅する。
動的変数の値は, (dynamic var) によって参照できる。
(dynamic var) →<object> 特殊演算子
この特殊形式は,動的変数の参照を表す。この特殊形式は,defdynamic又はdynamic-letで定義された変
数varの存在期間内だけで使用できる。
活動中,最も近くに設定され,かつ,現在も有効な変数varの動的束縛の値が返される。そのような束
縛が存在しない場合は,エラーが発生する(エラー名unbound-variable)。
(setf (dynamic var) orm) →<object> 特殊形式
この特殊形式は,動的変数への代入を表す。この特殊形式は, (dynamic var) が使用できるところなら,
どこででも使うことができる。
formが評価され,その結果が変数varの動的束縛を変更するために使用される。変数varが動的な値を
もたない場合は,エラーが発生する(エラー名unbound-variable)。dynamicに対するsetfは,束縛の変更

――――― [JIS X 3012 pdf 33] ―――――

                                                                                             29
X 3012 : 1998 (ISO/IEC 13816 : 1997)
にだけ用いられ,束縛の設定には用いられない。
(dynamic-let ((var form)*) body-form*) →<object> 特殊演算子
dynamic-let形式は,動的変数束縛の設定に使われる。最初の部分式(dynamic-let変数リスト)は,対 (var
form) のリストとする。dynamic-letで定義される識別子varの有効範囲は,最上位有効範囲全体とする。
各varの束縛の存在期間は,dynamic-letの本体の実行中とする。dynamic-let形式は,指定されたすべての
varに対する動的変数束縛を設定する。
varという名前の動的変数への参照は,dynamic形式を使って行わなければならない。
すべての初期化形式は,左から右に順に評価され,値はそれぞれ対応するvarと対応付けられる。これ
らの追加された動的束縛及び既に存在する可視な識別子の束縛を使って,評価形式body-form*が順に評価
される。
dynamic-letの返り値は,本体の最後のbody-formの値(body-formがない場合は,nil)とする。dynamic-let
から制御が離れるときに束縛は解消される。
例 (defun foo (x)
(dynamic-let ((y x))
(bar 1))) ⇒ foo
(defun bar (x)
(+ x (dynamic y))) ⇒ bar
(foo 2) ⇒3

6.4 条件式

 (if test-form then-form [else-form]) →<object>                                    特殊演算子
if形式は,まずtest-formを評価する。その結果がnil以外の値であれば,then-formを評価し,その値を
返す。そうでなければ(もしtest-formがnilを返すならば),else-formを評価し,その値を返す。
else-formがない場合は,nilが省略されたものとする。
例 (if (> 3 2) es no) ⇒ yes
(if (> 2 3) es no) ⇒ no
(if (> 2 3) es) ⇒ nil
(if (>3 2) (- 3 2) (+ 3 2)) ⇒1
(let ((x 7))
(if (< x 0) x (- x))) ⇒ -7
(cond (test form*)*) →<object> 特殊演算子
condの実行では,節 (test form*) を順に走査し,各節のtestを評価する。testがnil以外の値を返せば,
走査を停止し,対応する節のform*が順に評価され,その最後のformの値が返される。どのtestの値も真
でなければ,nilが返される。testが真である節にformが一つもなければ,testの値が返される。
cond形式は,次と同値とする。
(cond) ≡ nil
(cond (test1) ≡ (or test1
(test2 form2*) (cond (test2 form2*)
...) ...))

――――― [JIS X 3012 pdf 34] ―――――

30
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(cond (test1 form1+) ≡ (if test1
(test2 form2*) (progn form1+)
...) (cond (test2 form2*)
...))
例 (cond ((> 3 2) reater)
((< 3 2) less)) ⇒ greater
(cond ((> 3 3) reater)
((< 3 3) less)) ⇒ nil
(cond ((> 3 3) reater)
((< 3 3) less)
(t equal)) ⇒ equal
(case keyform ((key*) orm*)* [(t form*) ]) →<object> 特殊演算子
(case-using predform keyform ((key*) orm*)* [ (t form*) ]) →<object> 特殊演算子
case形式及びcase-using形式は,分類形式 (case form) と呼ばれ,一連の節の中から評価形式keyformの
値に一致する節を実行する機構を提供する。
実行される節は,キーの集合で識別される。キーkeyは,いかなるオブジェクトでもよい。最後の節の
キーリストがtである場合は,いずれのキーもkeyformに一致しないときに,その最後の節が実行される。
keyformは,分類形式の実行開始時に計算される評価形式とする。keyformの評価結果がkeyと一致すれ
ば,対応する節内の評価形式が順に評価され,最後の値が分類形式全体の値として返される。caseは,一
致するかどうかをeqlによって判断する。case-usingは,一致の判断をpredformの評価結果を用いて行う。
predformは,keyformの評価結果とkeyとを引数として受け取る真偽値関数又は準真偽値関数でなければな
らない。一致したkeyにformがなければ,分類形式はnilを返す。keyformの値がすべてのkeyと異なり,
かつ最後の節のキーリストがtであれば,その節の評価形式が順に評価され,最後の評価形式の値が分類
形式の結果となる。keyformの値がすべてのkeyと異なり,かつ最後の節のキーリストがtでなければ,分
類形式はnilを返す。
一つの分類形式では,同じkeyは2回以上現れてはならない。
例 (case (* 2 3)
((2 3 5 7) rime)
((4 6 8 9) omposite)) ⇒ composite
(case (car (c d))
((a) a)
((b) b)) ⇒ nil
(case (car (cd))
((a i u e o) owel)

――――― [JIS X 3012 pdf 35] ―――――

次のページ PDF 36

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

  • ISO/IEC 13816:1997(IDT)

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