Я изучал Clojure и озадачен следующим:
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_
Добавьте add :while (not= a b), я ожидаю увидеть пустой список, поскольку цикл должен остановиться, если условие ложно. В этом случае это самый первый элемент, где a= b= 1. Давайте посмотрим:
user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])
([2 1] [3 1] [3 2]) ; _surprise!_
Изменение :while на :when для фильтрации (= a b) пар
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_
Может ли кто-нибудь объяснить, почему (for [ ... :while ..] ...) ведет себя так?
Я использую Clojure 1.3 для OS X.
Благодарим вас и извиниться за отсутствие форматирования. Это мой девственный пост в StackOverflow.