2012-04-05 26 views
11

Clojure có một 'vòng lặp' mạnh mẽ như lisp thông thường.Nhận hai phần tử từ một chuỗi mỗi lần

ví dụ:

nhận được hai yếu tố từ một chuỗi mỗi lần

Common Lisp:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b)) 

làm thế nào để làm điều này trong Clojure?

+1

Bạn có thể triển khai CL trong clojure ... –

+0

Vui lòng xác định "mạnh". –

Trả lời

13

Bằng cách tận dụng for và một số destructuring bạn có thể đạt được ví dụ cụ thể của bạn:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b)) 
+0

Lưu ý rằng 'for' không phải là cấu trúc vòng lặp, nhưng việc hiểu danh sách, tạo ra một kết quả lười biếng. Ngoài ra, trái ngược với Common LISP, rất khó để làm cho nó hoạt động rất tốt. –

+0

@Marko - bạn có ví dụ cụ thể không? – sw1nn

+0

Không hiểu - ví dụ về chính xác những gì? –

2

Clojure của đa mục đích vòng lặp cấu trúc là for. Nó không có nhiều tính năng như CL2 loop của CL được tích hợp sẵn (đặc biệt không phải là hiệu ứng phụ, vì Clojure khuyến khích độ tinh khiết chức năng), vì vậy nhiều thao tác bạn có thể thực hiện đơn giản chỉ với loop được thực hiện "xung quanh" for. Ví dụ: để tổng hợp các phần tử được tạo bởi for, bạn sẽ đặt apply + ở phía trước nó; để đi bộ các phần tử theo cặp, bạn sẽ (như sw1nn hiển thị) sử dụng partition 2 trên chuỗi đầu vào được nạp vào for.

1

Tôi sẽ làm điều này với loop, recur và phá hủy.

Ví dụ, nếu tôi muốn nhóm mỗi hai giá trị với nhau:

(loop [[a b & rest] [1 2 3 4 5 6] 
     result []] 
    (if (empty? rest) 
    (conj result [a b]) 
    (recur rest (conj result [a b])))) 

kết thúc với một kết quả của:

=> [[1 2] [3 4] [5 6]]

ab là những yếu tố đầu tiên và thứ hai của trình tự tương ứng, và sau đó rest là những gì còn lại. Sau đó chúng tôi có thể đi lại xung quanh cho đến khi không có gì còn sót lại trong rest và chúng tôi đã hoàn tất.

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