## 迭代
有很多方法可以遍历一个集合。
宏 `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
```