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コマンドから返されます。
page:https://minegishirei.hatenablog.com/entry/2023/04/24/185332