### 列表推導式
宏 `for` 和 `doseq` 可以用來做list comprehension. 它們支持遍歷多個集合 (最右邊的最快) ,同時還可以做一些過濾用 `:when 和` `:while。` 宏 `for` 只接受一個表達式 , 它返回一個懶惰集合作為結果. 宏 `doseq` 接受任意數量的表達式, 以有副作用的方式執行它們, 并且返回 `nil` .
下面的例子會打印一個矩陣里面 所有的元素出來。 它們會跳過 “B” 列 并且只輸出小于3的那些行。我們會在“序列”那一節介紹 `dorun` , 它會強制提取 for 所返回的懶惰集合.
```
(def cols "ABCD")
(def rows (range 1 4)) ; purposely larger than needed to demonstrate :while
(println "for demo")
(dorun
(for [col cols :when (not= col \B)
row rows :while (< row 3)]
(println (str col row))))
(println "\ndoseq demo")
(doseq [col cols :when (not= col \B)
row rows :while (< row 3)]
(println (str col row)))
```
上面的代碼的輸出是這樣的:
```
for demo
A1
A2
C1
C2
D1
D2
doseq demo
A1
A2
C1
C2
D1
D2
```
宏 `loop` 是一個special form, 從它的名字你就可以猜出來它是用來遍歷的. 它以及和它類似的 `recur` 會在下一節介紹.