Uczę Clojure i zaskoczony brzmienie:Zaintrygowany: Clojure dla pętli z: while -> nieoczekiwane zachowanie?
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_
Dodajmy :while (not= a b)
, spodziewam się, aby zobaczyć pustą listę jako pętla powinna zatrzymać, jeśli warunek jest fałszywy. W tym przypadku jest to pierwszy element, w którym a
= b
= 1. Zobaczmy:
user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])
([2 1] [3 1] [3 2]) ; _surprise!_
Zmiana :while
do :when
odfiltrować (= a b)
par
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_
Czy ktoś może wyjaśnić dlaczego (for [ ... :while ..] ...)
zachowuje się jak ten?
Używam Clojure 1.3 na OS X.
Dziękuję i przepraszam za brak formatowania. To jest mój dziewiczy post na StackOverflow.
Dziękuję, Nikita. Więc jeśli: dotyczy tylko wewnętrznej pętli, to jak mogę ją zastosować do zewnętrznej pętli? Problem, który mam, to: (od [od [: a: b: c: d: e: f] do [: a: b: c: d: e: f]: let [ścieżka (find-path ab)] : while path) path); pętla powinna się zatrzymać, gdy ścieżka jest zerowa. – jbear
Przepraszam, miałem na myśli (dla [od [: a: b: c: d: e: f] do [: a: b: c: d: e: f]: let [ścieżka (find-ścieżka od do) ]: while path] path) – jbear
@jbear, nie wiem :(Może lepiej będzie utworzyć leniwy seq ścieżek i weź gdy nie są one puste.Nie jestem pewien, że 'for' jest leniwy. –