## 迭代
有很多方法可以遍歷一個集合。
宏 `dotimes` 會執行給定的表達式一定次數, 一個本地binding會被給定值:從0到一個給定的數值. 如果這個本地binding是不需要的 (下面例子里面的 `card-number` ), 可以用下劃線來代替, 看例子:
```
(dotimes [card-number 3]
(println "deal card number" (inc card-number))) ; adds one to card-number
```
注意下上面例子里面的 `inc` 函數是為了讓輸出變成 1, 2, 3 而不是 0, 1, 2。上面代碼的輸出是這樣的:
```
deal card number 1
deal card number 2
deal card number 3
```
宏 `while` 會一直執行一個表達式只要指定的條件為true. 下面例子里面的 `while` 會一直執行,只要這個線程沒有停:
```
(defn my-fn [ms]
(println "entered my-fn")
(Thread/sleep ms)
(println "leaving my-fn"))
(let [thread (Thread. #(my-fn 1))]
(.start thread)
(println "started thread")
(while (.isAlive thread)
(print ".")
(flush))
(println "thread stopped"))
```
上面代碼的輸出是這樣的:
```
started thread
.....entered my-fn.
.............leaving my-fn.
thread stopped
```