繰返し



while test {form}* [特殊]

testがnon-NILと評価されている間、 formは、繰返し評価される。 whileは、formのまわりにNILと名付けられるブロックを自動的に確定する 特殊書式である。 returnは、そのループから抜け出すために使用することができる。 次のイテレーションへ飛ぶときためには後に紹介するtagbodygoを次のように使う:


(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 $ \vert$ statement}* [特殊]

tagは、goのために名付けられる。 tagbodyの中のみgoを使用することができる。


go tag [特殊]

ローカルにスコープされたtagbodyのなかに現れるtagの直後の 書式に制御を移す。 ローカルスコープを横切って違うtagbodyのtagに制御を移すことは 禁止されている。


prog ({var $ \vert$ (var [init])}*) {tag $ \vert$ statement}* [マクロ]

progはマクロで、以下のように展開される。

 (block nil     (let var (tagbody  tag $ \vert$ statement))) 


do ({(var init [next])}*) (endtest [result]){declare} {form} * [マクロ]

varはローカル変数である。 それぞれのvarに、initは並行に評価され、割り当てられる。 つぎに、endtestが評価され、もし真のときdoresultを返す。 (そうでないときは、NILを返す) もしendtestがNILを返したならば、それぞれのformは、 順番に評価される。 書式の評価後、nextが評価され、その値は それぞれのvarに再割当され、次の繰返しが始まる。


do* ({var init [next]}*) (endtest [result]){declare} {form}* [マクロ]

do*は、initnextの評価と 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またはgoformsのなかで評価されなければならない。


2016-04-05