する

Scheme の do 関数は、初期化、更新、終了条件による反復を可能にするループ メカニズムです。これは、一連の操作を特定の回数、または条件が満たされるまで実行する必要がある場合に特に便利です。

do の一般的な形式は次のとおりです。

(do ((var1 init1 update1)
     (var2 init2 update2)
     (var3 init3 update3))
    (termination-condition result)
  body)
  • 変数: ループ変数。
  • 初期値: 各ループ変数の開始値。
  • Update-expression: 各反復の終了時にループ変数を更新する式。
  • 終了条件: ループを停止する条件。
  • Result-expression: ループ終了時に返される値。
  • 本文: 各反復で実行するコード。

例: 1 から 5 までの数値を合計する

(do ((i 1 (+ i 1))      ; Initialize i to 1, increment by 1
     (sum 0 (+ sum i))) ; Initialize sum to 0, add i to sum
    ((> i 5) sum)       ; Terminate when i > 5, return sum
  (lumi-message (number->string sum))) ; Print sum at each step
  • ループ変数 i は 1 から始まり、反復ごとに 1 ずつ増加します。
  • 変数 sum は、i の合計を蓄積します。
  • ループは i > 5 で終了し、sum の最終値を返します。

出力: 15


仕組み

  1. 初期化:

    • 各ループ変数には初期値が割り当てられます。
  2. 終了チェック:

    • 各反復の開始時に、終了条件がチェックされます。 true の場合、ループが停止し、結果式が評価されます。
  3. 反復:

    • 終了条件が false の場合、本体が実行され、それぞれの更新式を使用してループ変数が更新されます。

概要

  • do 構造は、複数の変数と複雑な終了条件を含むループを実装する柔軟な方法を提供します。
  • 繰り返しにわたって状態を更新する必要があるタスクに役立ちます。
  • 終了条件はループがいつ終了するかを決定し、最終結果を返すことができます。

do を使用すると、初期化、更新、終了を正確に制御しながら反復アルゴリズムを Scheme に実装できます。これにより、doスコープ指定されたバインディング メカニズム (let など) と 反復制御構造 の組み合わせとなり、クリーンで簡潔な方法でループと一時状態を処理できるようになります。