do 迴圈
Common Lisp 中的大多數迴圈和條件結構實際上是隱藏更多基本結構的巨集 。例如,dotimes
和 dolist
建立在 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)))
對於最常見的應用程式,更具體的 dotimes
和 doloop
巨集更簡潔。