2012-06-10 53 views
13

我学习Clojure的,但不是很清楚的差异:while:when测试之间:有什么区别:while和:在clojure时?

=> (for [x [1 2 3] y [1 2 3] :while (= (mod x y) 0)] [x y]) 
([1 1] [2 1] [2 2] [3 1]) 
=> (for [x [1 2 3] y [1 2 3] :when (= (mod x y) 0)] [x y]) 
([1 1] [2 1] [2 2] [3 1] [3 3]) 

可以通过详细阐述了他们任何人的帮助?

回答

24

:when迭代,但只评估体条件为真时的循环。 :while遍历绑定和评估身体直到条件为假:

(for [x (range 20) :when (not= x 10)] x) 
; =>(0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19) 

(for [x (range 20) :while (not= x 10)] x) 
; => (0 1 2 3 4 5 6 7 8 9) 
+3

请注意,如果首选,您可以使用(不是= x 10)而不是(不是(= x 10))。 – uvtc

+0

欢呼!编辑我的答案。 – Gert

7

:当阻止任何内部'for'绑定或其体表达式被评估为一次迭代时,就像'filter'函数一样。

:而停止这个从出发更多的,演戏更像是“走,而”