loop
マクロは本質的に、Lisp内にループを記述するために特別に
仕立てられたミニ言語を作る。この言語は正規のLispの標準からは少し奇妙に
見えるが、とても学びやすく、その目的によく適していることがわかる。
loop
はマクロなので、ループ言語のすべての構文解析は
バイトコンパイル時に行なわれる; コンパイルされたloop
は、
手書きの同等のwhile
ループとちょうど同じ効率である。
ループ構文要素はclauseの連続から成り、それぞれはfor
や
do
のようなシンボルによって導入される。節は単純に、最小の余分な
括弧とともにloop
の引数リストに一列に一緒に並べられる。
さまざまな節の型は、一時変数の束縛のような初期化や、ループ内で
行なわれる実行、ステップ実行、最後の大掃除を指定する。
Common Lispはある一般的な節の順序をループ中に指定する:
(loop name-clause var-clauses… action-clauses…)
name-clauseは付加的にループを囲む暗黙のブロックに名前を与える。
既定では、暗黙のブロックはnil
と名付けられる。var-clauses
はループ中にどの変数が束縛されるかや、どのようにループの進行の間に
修正されたり繰り返されるかを指定する。action-clausesは、計算や
集積、値の戻しなど、ループの間になされることである。
loop
マクロのEmacs版は節の順序について制限はより弱いが、実行節の
前にwith
やfor
、repeat
のような変数束縛節を置く場合、
物事はほぼ予想されるように振る舞う。Common Lispと同様に、
initially
とfinally
はどこにでも置ける。
ループは一般に既定ではnil
を戻すが、collect
のような
蓄積節を使ったり、always
のような終了テスト節を使ったり、暗黙の
ブロックから飛び出すための明示的なreturn
節を持ったりすることで
値を戻すようにすることができる。(ループ本体は暗黙のブロックに
囲まれているから、ループから脱出するために正規Lispのreturn
や
return-from
を使うこともできる。)
下記の節は動作するループマクロのいくつかの例を与え、特別のループ節を
非常に詳細に記述する。追加の議論やloop
マクロの例はSteeleの
Common Lisp, the Language第2版を調べること。