В чем разница между: while и: когда в clojure?
Я изучаю clojure, но не совсем понимаю разницу между тестом :while
и :when
:
=> (for [x [1 2 3] y [1 2 3] :while (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1])
=> (for [x [1 2 3] y [1 2 3] :when (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1] [3 3])
Может ли кто-нибудь помочь, разработав их?
Ответы
Ответ 1
:when
выполняет итерации по связям, но только вычисляет тело цикла, когда условие истинно. :while
выполняет итерацию по привязкам и вычисляет тело до тех пор, пока условие не будет false:
(for [x (range 20) :when (not= x 10)] x)
; =>(0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19)
(for [x (range 20) :while (not= x 10)] x)
; => (0 1 2 3 4 5 6 7 8 9)
Ответ 2
: когда запрещается привязывать внутренние привязки или для выражения своего тела для этой итерации, действуя как функция "фильтр".
: в то время как это ограничение перестает действовать, действуя больше как 'take-while'
Ответ 3
Посмотрите на последний пример:
http://clojuredocs.org/clojure_core/clojure.core/for#example_913