2012-06-10 70 views
13

Tôi đang học clojure nhưng không hoàn toàn rõ ràng về sự khác biệt giữa các thử nghiệm :while:when:Sự khác biệt giữa: while và: khi nào trong clojure?

=> (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]) 

Can ai giúp đỡ bằng cách xây dựng trên đó?

Trả lời

24

:when lặp trên các ràng buộc, nhưng chỉ đánh giá cơ thể của vòng lặp khi điều kiện là đúng. :while lặp trên các ràng buộc và đánh giá các cơ cho đến khi điều kiện là sai:

(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) 
+3

Lưu ý, bạn có thể sử dụng (không = x 10) thay vì (không (= x 10)), nếu được ưu tiên. – uvtc

+0

cổ vũ! Đã chỉnh sửa câu trả lời của tôi. – Gert

7

: khi ngăn chặn bất kỳ ràng buộc bên trong 'cho' hoặc biểu thức cơ thể của nó khỏi bị đánh giá cho một lần lặp đó, hoạt động giống như chức năng 'bộ lọc'.

: khi ngừng này ràng buộc từ tiến nữa, hành động giống như 'cất trong khi'

Các vấn đề liên quan