Next: , Previous: , Up: ループ機能   [Contents][Index]


4.7.1 ループの基本

loopマクロは本質的に、Lisp内にループを記述するために特別に 仕立てられたミニ言語を作る。この言語は正規のLispの標準からは少し奇妙に 見えるが、とても学びやすく、その目的によく適していることがわかる。

loopはマクロなので、ループ言語のすべての構文解析は バイトコンパイル時に行なわれる; コンパイルされたloopは、 手書きの同等のwhileループとちょうど同じ効率である。

Special Form: loop clauses…

ループ構文要素はclauseの連続から成り、それぞれはfordoのようなシンボルによって導入される。節は単純に、最小の余分な 括弧とともにloopの引数リストに一列に一緒に並べられる。 さまざまな節の型は、一時変数の束縛のような初期化や、ループ内で 行なわれる実行、ステップ実行、最後の大掃除を指定する。

Common Lispはある一般的な節の順序をループ中に指定する:

(loop name-clause
      var-clausesaction-clauses…)

name-clauseは付加的にループを囲む暗黙のブロックに名前を与える。 既定では、暗黙のブロックはnilと名付けられる。var-clauses はループ中にどの変数が束縛されるかや、どのようにループの進行の間に 修正されたり繰り返されるかを指定する。action-clausesは、計算や 集積、値の戻しなど、ループの間になされることである。

loopマクロのEmacs版は節の順序について制限はより弱いが、実行節の 前にwithforrepeatのような変数束縛節を置く場合、 物事はほぼ予想されるように振る舞う。Common Lispと同様に、 initiallyfinallyはどこにでも置ける。

ループは一般に既定ではnilを戻すが、collectのような 蓄積節を使ったり、alwaysのような終了テスト節を使ったり、暗黙の ブロックから飛び出すための明示的なreturn節を持ったりすることで 値を戻すようにすることができる。(ループ本体は暗黙のブロックに 囲まれているから、ループから脱出するために正規Lispのreturnreturn-fromを使うこともできる。)

下記の節は動作するループマクロのいくつかの例を与え、特別のループ節を 非常に詳細に記述する。追加の議論やloopマクロの例はSteeleの Common Lisp, the Language第2版を調べること。