lispのloopの使い方

Lisploopコマンドは、反復処理を行うための非常に柔軟なコマンドです。以下は、基本的なloopコマンドの構文です。

(loop
  [var1 init1 step1]
  [var2 init2 step2]
  ...
  [finally result]
  body...)

ここで、var1var2などの変数は、反復処理中に使用する変数です。init1init2などの式は、各変数の初期値を指定します。step1step2などの式は、各反復の終わりに実行する式を指定します。bodyは、反復処理で実行されるコマンドのリストです。

例えば、次のように書くことができます。

(loop for i from 1 to 10 do
  (print i))

上記の例では、変数iを1から10までの整数で初期化し、各反復で1ずつ増加します。そして、各反復でiの値を印刷するコマンドを実行します。

また、以下はloopコマンドの一般的な機能のいくつかです。

  • for:反復変数の定義
  • from:反復変数の初期値
  • to:反復変数の最終値
  • by:反復変数の増分(負の値も指定できます)
  • do:反復中に実行するコマンド
  • finally:反復の最後に実行する式

loopコマンドは非常に強力であるため、上記の機能に加えて、多数のオプションをサポートしています。詳細については、Common Lisp Hyperspecloopページを参照してください。

範囲指定してリストを作る

loopコマンドとcollectキーワードを使用して、リストを作成するLispコードの例を以下に示します。

(loop for i from 1 to 10
      when (oddp i) collect i)

上記のコードでは、変数iを1から10までの整数で初期化し、各反復で1ずつ増加します。そして、whenキーワードを使用して、iが奇数の場合にcollectキーワードを実行します。collectキーワードは、反復中に生成された値をリストに追加します。

上記のコードを実行すると、iが奇数の場合、collectキーワードによってiがリストに追加され、最終的には1、3、5、7、9のリストが生成されます。このリストは、loopコマンドが返す値として使用できます。

また、loopコマンドのcollectキーワードは、他のLispデータ型でも使用できます。たとえば、以下のコードは、反復中に生成された文字列をハッシュテーブルに追加します。

(loop for i from 1 to 10
      when (oddp i) collect (format nil "odd number: ~A" i) into ht
      finally (return ht))

上記のコードでは、collectキーワードは、format関数によって生成された文字列をhtという名前のハッシュテーブルに追加します。intoキーワードは、追加するハッシュテーブルを指定するために使用されます。最後に、finallyキーワードは、反復の最後に実行される式を指定します。この場合、returnキーワードによって、ハッシュテーブルがloopコマンドから返されます。