he estado aprendiendo Clojure y desconcertado por la siguiente:Desconcertado: Clojure for loop with: while -> comportamiento inesperado?
user=> (for [a (range 1 4) b (range 1 4)] [a b])
([1 1] [1 2] [1 3] [2 1] [2 2] [2 3] [3 1] [3 2] [3 3]); _no surprise here_
Vamos a añadir :while (not= a b)
, espero ver una lista vacía como el bucle debe detenerse si la condición es falsa. En este caso, es el primer elemento donde a
= b
= 1. Veamos:
user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])
([2 1] [3 1] [3 2]) ; _surprise!_
Cambio :while
a :when
para filtrar (= a b)
pares
user=> (for [a (range 1 4) b (range 1 4) :when (not= a b) ] [a b])
([1 2] [1 3] [2 1] [2 3] [3 1] [3 2]); _expected_
podría alguien explicar por qué se comporta como (for [ ... :while ..] ...)
esto?
estoy usando Clojure 1.3 en OS X.
Gracias y disculpas por la falta de formato. Esta es mi publicación virgen en StackOverflow.
Gracias, Nikita. Entonces, si: mientras solo se aplica al ciclo interno, ¿cómo hago que se aplique también al ciclo externo? El problema que tengo es: (para [de [: a: b: c: d: e: f] a [: a: b: c: d: e: f]: dejar [camino (buscar-camino ab)] : while path) path); el ciclo debería detenerse cuando el camino es nulo. – jbear
Lo siento, me refería al (para [de [: a: b: c: d: e: f] a [: a: b: c: d: e: f]: dejar [ruta (buscar-ruta desde a)] ]: while path] path) – jbear
@jbear, no sé :(Puede ser que sea mejor que cree un seq perezoso de rutas y tome mientras no sean nulas. No estoy seguro de que 'for' sea flojo. –