Tôi đã học Clojure và bối rối bởi những điều sau đây:Khó hiểu: Clojure cho vòng lặp với: while -> hành vi bất ngờ?
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_
Hãy thêm :while (not= a b)
, tôi mong đợi để xem một danh sách rỗng như vòng lặp nên dừng lại nếu điều kiện là sai. Trong trường hợp này, đây là mục đầu tiên trong đó a
= b
= 1. Hãy xem:
user=> (for [a (range 1 4) b (range 1 4) :while (not= a b) ] [a b])
([2 1] [3 1] [3 2]) ; _surprise!_
Thay đổi :while
-:when
để lọc ra (= a b)
cặp
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_
bất cứ ai có thể giải thích lý do tại sao (for [ ... :while ..] ...)
cư xử như thế này?
Tôi đang sử dụng Clojure 1.3 trên OS X.
Cảm ơn bạn và xin lỗi vì thiếu định dạng. Đây là bài đăng trinh của tôi trên StackOverflow.
Cảm ơn bạn, Nikita. Vì vậy, nếu: trong khi chỉ áp dụng cho vòng lặp bên trong, làm thế nào để làm cho nó áp dụng cho vòng lặp bên ngoài là tốt? Vấn đề tôi có là: (đối với [từ [: a: b: c: d: e: f] thành [: a: b: c: d: e: f]: cho phép [đường dẫn (tìm đường dẫn ab)] : trong khi đường dẫn) đường dẫn); vòng lặp nên dừng khi đường dẫn là 0. – jbear
Xin lỗi, ý tôi là (đối với [từ [: a: b: c: d: e: f] thành [: a: b: c: d: e: f]: cho phép [đường dẫn (tìm đường dẫn đến) ]: trong khi đường dẫn] đường dẫn) – jbear
@ jbear, tôi không biết: (Có thể là bạn nên tạo ra các đường dẫn lười biếng và đi trong khi chúng không rỗng. Tôi không chắc chắn rằng 'for' là lười biếng. –