while test {form}* [特殊]
-
-
testがnon-NILと評価されている間、
formは、繰返し評価される。
whileは、formのまわりにNILと名付けられるブロックを自動的に確定する
特殊書式である。
returnは、そのループから抜け出すために使用することができる。
次のイテレーションへ飛ぶときためには後に紹介するtagbodyとgoを次のように使う:
(setq cnt 0)
(while
(< cnt 10)
(tagbody while-top
(incf cnt)
(when (eq (mod cnt 3) 0)
(go while-top)) ;; jump to next iteraction
(print cnt)
)) ;; 1, 2, 4, 5, 7, 8, 10
tagbody {tag statement}* [特殊]
-
-
tagは、goのために名付けられる。
tagbodyの中のみgoを使用することができる。
go tag [特殊]
-
-
ローカルにスコープされたtagbodyのなかに現れるtagの直後の
書式に制御を移す。
ローカルスコープを横切って違うtagbodyのtagに制御を移すことは
禁止されている。
prog ({var (var [init])}*) {tag statement}* [マクロ]
-
-
progはマクロで、以下のように展開される。
(block nil (let var (tagbody tag statement)))
do ({(var init [next])}*) (endtest [result]){declare} {form}
* [マクロ]
-
- varはローカル変数である。
それぞれのvarに、initは並行に評価され、割り当てられる。
つぎに、endtestが評価され、もし真のときdoはresultを返す。
(そうでないときは、NILを返す)
もしendtestがNILを返したならば、それぞれのformは、
順番に評価される。
書式の評価後、nextが評価され、その値は
それぞれのvarに再割当され、次の繰返しが始まる。
do* ({var init [next]}*) (endtest [result]){declare} {form}* [マクロ]
-
- do*は、initとnextの評価と
varへの割り当てが連続的に起こることを除いて、doと同様である。
dotimes (var count [result]) {forms}* [マクロ]
-
-
formsの評価をcount回行う。
countは、一回のみ評価される。
それぞれの評価の中で、varは整数のゼロから
count-1まで増加する。
dolist (var list [result]) {forms}* [マクロ]
-
-
listのそれぞれの要素は、varに連続的に与えられる。
そしてformsは、それぞれの値で評価される。
dolistは、他の繰返しより早く実行される。たとえば、
mapcarや再帰的関数のようなものより。
それは、dolistが関数のclosureを作ったり適用したりする必要が
なく、新しいパラメータのバインドが必要でないため。
until condition {forms}* [マクロ]
-
-
conditionが満たされている間、formsを評価する。
loop {forms}* [マクロ]
-
-
formsを永遠に評価する。
実行を止めるためには、return-from, throwまたはgoが
formsのなかで評価されなければならない。
2016-04-05