Я изучаю 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_
Давайте добавим :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.