2012-06-10 9 views
13

estoy estudiando clojure pero no del todo clara en la diferencia entre la prueba y :while:when:¿Cuál es la diferencia entre: while y: when in 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]) 

Puede alguien ayuda elaborando en ellos?

Respuesta

24

:when itera sobre los enlaces, pero sólo evalúa el cuerpo del bucle cuando la condición es verdadera. :while itera sobre los enlaces y evalúa el cuerpo hasta la condición es falsa:

(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

Nota, puede usar (no = x 10) en lugar de (no (= x 10)), si lo prefiere. – uvtc

+0

¡salud! Editado mi respuesta. – Gert

7

: cuando impide cualquier vinculación interna 'para' o su expresión corporal se evalúa para esa iteración, actuando como la función 'filtro'.

: mientras se detiene esta unión de proceder más, actuando más como 'take-while'

Cuestiones relacionadas