do 迴圈

Common Lisp 中的大多數迴圈和條件結構實際上是隱藏更多基本結構的巨集 。例如,dotimesdolist 建立在 do 巨集上。do 的形式如下:

(do (varlist)
    (endlist)
   &body)
  • varlist 由迴圈中定義的變數,它們的初始值以及它們在每次迭代後如何變化組成。在迴圈結束時評估更改部分。
  • endlist 包含結束條件和迴圈結束時返回的值。在迴圈開始時評估結束條件。

這是從 0 開始並向上(不包括)10 的那個。

;;same as (dotimes (i 10)) 
(do (( i (+ 1 i))
    ((< i 10) i)
   (print i))

這是一個在列表中移動的:

;;same as (dolist (item given-list)
(do ((item (car given-list))
     (temp list (cdr temp))
   (print item))

varlist 部分類似於 let 宣告中的部分。你可以繫結多個變數,它們只存在於迴圈內。宣告的每個變數都在其自己的括號中。這是一個計算列表中有多少 1 和 2 的人。

(let ((vars (list 1 2 3 2 2 1)))
  (do ((ones 0)
       (twos 0)
       (temp vars (cdr temp)))
      ((not temp) (list ones twos))
    (when (= (car temp) 1)
      (setf ones (+ 1 ones)))
    (when (= (car temp) 2)
      (setf twos (+ 1 twos)))))
-> (2 3)

如果還沒有實現 while 迴圈巨集:

(do ()
    (t)
  (when task-done
    (break)))

對於最常見的應用程式,更具體的 dotimesdoloop 巨集更簡潔。