16

:while私は clojure を勉強していますが、と:whentestの違いがよくわかりません:

=> (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])

誰かがそれらについて詳しく説明することで助けることができますか?

4

3 に答える 3

28

:whenバインディングを反復処理しますが、条件が true の場合にのみループの本体を評価します。:whileバインディングを反復処理し、条件が false になるまで本体を評価します。

(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)
于 2012-06-10T05:32:34.770 に答える
8

:when は、内部の 'for' バインディングまたはその本体式がその 1 回の繰り返しで評価されるのを防ぎ、'filter' 関数のように機能します。

:while は、このバインディングの進行を停止し、「take-while」のように動作します。

于 2012-06-10T05:05:50.377 に答える
1

ここで最後の例を見てください: http://clojuredocs.org/clojure_core/clojure.core/for#example_913

于 2012-06-10T05:13:28.107 に答える