2012-06-10 49 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'函數一樣。

:而停止這個從出發更多的,演戲更像是「走,而」