while ¶ を使ったループ処理while
式の真偽判定が評価時に真の値を返す限り、本体は繰り返し評価されます。Lispインタプリタが、飛行機が旋回するように同じことを何度も繰り返すため、このプロセスはループと呼ばれます。真偽判定の結果が偽の場合、Lispインタプリタは
while 式の残りの部分を評価せず、ループを終了します。
明らかに、while
の第1引数を評価して返される値が常に真である場合、後続の本体は何度も、何度も……そして永遠に評価され続けます。逆に、返される値が決して真でない場合、本体内の式が評価されることはありません。while
ループを書くコツは、真偽判定が後続の式を評価させたい回数分だけ真を返し、その後は偽を返すような仕組みを選択することにあります。
while を評価して返される値は、true-or-false
判定の結果となります。ここから得られる興味深い帰結は、エラーなく評価された while
ループは、1回、100回、あるいは一度もループしなかったかにかかわらず、nil または false
を返すということです。正常に評価された while 式が true
の値を返すことは決してありません! つまり、while は常に副作用、すなわち while
ループの本体内にある式を評価した結果のために評価されるということです。これは理にかなっています。求められているのは単なるループという行為ではなく、ループ内の式が繰り返し評価されたときに何が起こるかという結果なのです。