Lispのloop
コマンドは、反復処理を行うための非常に柔軟なコマンドです。以下は、基本的なloop
コマンドの構文です。
(loop [var1 init1 step1] [var2 init2 step2] ... [finally result] body...)
ここで、var1
、var2
などの変数は、反復処理中に使用する変数です。init1
、init2
などの式は、各変数の初期値を指定します。step1
、step2
などの式は、各反復の終わりに実行する式を指定します。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 Hyperspecのloop
ページを参照してください。
範囲指定してリストを作る
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
コマンドから返されます。