Next: , Previous: Combining Conditions, Up: Control Structures


9.4 繰り返し

繰り返しとは、プログラムのある部分を何度も実行することです。 たとえば、リストの各要素や0からnの各整数について 1回ずつある計算を行いたい場合です。 Emacs Lispでこれを行うには、スペシャルフォームwhileを使います。

— Special Form: while condition forms...

whileは、まずconditionを評価する。 結果がnil以外であれば、formsをテキスト上の順で評価する。 そして、conditionを評価し直し、その結果がnil以外であれば、 再度formsを評価する。 この処理をconditionnilに評価されるまで繰り返す。

繰り返し回数に制限はない。 ループは、conditionnilに評価される、 エラーが発生する、throwによりループから抜け出す (see Nonlocal Exits)のいずれかが起こるまで繰り返される。

フォームwhileの値はつねにnilである。

          (setq num 0)
               ⇒ 0
          (while (< num 4)
            (princ (format "Iteration %d." num))
            (setq num (1+ num)))
               -| Iteration 0.
               -| Iteration 1.
               -| Iteration 2.
               -| Iteration 3.
               ⇒ nil

終了検査のまえに各繰り返しごとに実行したいことがあれば、 以下のように、それらと終了検査をprognでまとめたものを whileの第1引数にする。

          (while (progn
                   (forward-line 1)
                   (not (looking-at "^$"))))

これは、1行先へ移動し、空行に達するまで、移動を繰り返す。 このwhileには本体がなく、 終了検査(かつポイントを実際に動かす)だけであるという点で、 風変わりである。