Ho imparato Clojure e perplesso dal seguente:Interpellato: Clojure per loop con: while -> comportamento inaspettato?
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_
Aggiungiamo :while (not= a b)
, mi aspetto di vedere una lista vuota come il ciclo dovrebbe smettere se la condizione è falsa. In questo caso è il primo oggetto in cui a
= b
= 1. Vediamo:
user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])
([2 1] [3 1] [3 2]) ; _surprise!_
Modifica :while
-:when
per filtrare (= a b)
coppie
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_
Qualcuno potrebbe spiegare perché (for [ ... :while ..] ...)
si comporta come questo?
sto usando Clojure 1.3 su OS X.
Grazie e ci scusiamo per la mancanza di formattazione. Questo è il mio post vergine su StackOverflow.
Grazie, Nikita. Quindi se: mentre si applica solo al ciclo interno, come faccio a farlo applicare anche al ciclo esterno? Il problema che ho è: (per [da [: a: b: c: d: e: f] a [: a: b: c: d: e: f]: let [percorso (find-path ab)] : while path) path); il ciclo dovrebbe fermarsi quando il percorso è zero. – jbear
Mi spiace, intendevo (per [da [: a: b: c: d: e: f] a [: a: b: c: d: e: f]: let [percorso (trova-percorso da a) ]: percorso percorso]) – jbear
@jbear, non so :(Potrebbe essere meglio creare sequenze pigre di percorsi e prendere mentre non sono nulli.Non sono sicuro che 'for' è pigro –