Next: Nonlocal Exits, Previous: Combining Conditions, Up: Control Structures [Contents][Index]
繰り返し(iteration)とは、プログラムの一部を繰り返し実行することを意味します。たとえば、リストの各要素、または0からnの整数にたいして、1度ずつ繰り返し何らかの計算をおこないたいとしましょうEmacs
Lispでは、スペシャルフォームwhileでこれを行なうことができます:
whileは、最初にconditionを評価します。結果が非nilの場合は、formsをテキスト順に評価します。その後conditionを再評価して、結果が非nilの場合、再度formsを評価します。この処理は、conditionがnilに評価されるまで繰り返されます。
繰り返し回数に制限はありません。このループは、conditionがnilに評価されるか、エラーとなるか、throwで抜け出す(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
各繰り返しごとに何かを実行して、その後も終了テストを行なう“repeat...until”ループを記述するには、以下のようにwhileの1番目の引数として、bodyの後に終了テストを記述して、それをprognの中に配します:
(while (progn
(forward-line 1)
(not (looking-at "^$"))))
これは1行前方に移動して、空行に達するまで行単位の移動を継続します。独特なのは、whileがbodyをもたず、終了テスト(これはポイント移動の実処理も行ないます)だけという点です。
マクロdolistおよびdotimesは、2つの一般的な種類のループを記述する、便利な方法を提供します。
この構成は、listの各要素にたいして1度bodyを実行し、カレント要素をローカルに保持するように、変数varにバインドします。その後、resultを評価した値、またはresultが省略された場合はnilをreturnします。たとえば、以下はreverse関数を定義するために、dolistを使用する方法の例です:
(defun reverse (list)
(let (value)
(dolist (elt list value)
(setq value (cons elt value)))))
この構成は、0以上count未満の各整数にたいして1度bodyを実行し、その繰り返しでの整数を、変数varにバインドします。その後、resultの値、またはresultが省略された場合はnilをreturnします。以下は、dotimesを使用して、何らかの処理を100回行なう例です:
(dotimes (i 100) (insert "I will not obey absurd orders\n"))