Scheme 中的 do 函數是一種循環機制,允許在初始化、更新和終止條件下進行迭代。當您需要執行一系列操作特定次數或直到滿足條件時,它特別有用。

do的一般形式是:

(do ((var1 init1 update1)
     (var2 init2 update2)
     (var3 init3 update3))
    (termination-condition result)
  body)
  • 變數:循環變數。
  • 初始值:每個循環變數的起始值。
  • 更新表達式:在每次迭代結束時更新循環變數的表達式。
  • 終止條件:停止循環的條件。
  • 結果表達式:循環終止時傳回的值。
  • 主體:每次迭代中執行的程式碼。

範例:將 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. 迭代

    • 如果終止條件為假,則執行主體,並使用各自的更新表達式更新循環變數。

總結

  • do 構造提供了一種靈活的方法來實現具有多個變數和複雜終止條件的循環。
  • 對於需要跨迭代更新狀態的任務非常有用。
  • 終止條件決定循環何時結束並可以返回最終結果。

透過使用do,您可以在Scheme中實現迭代演算法,並精確控制初始化、更新和終止。這使得do成為範圍綁定機制(如let)和迭代控制結構的組合,使其能夠以乾淨、簡潔的方式處理循環和臨時狀態。