2011-12-16 37 views
11

Tôi mới dùng Clojure và thấy rằng khi tôi lặp lại vectơ này trong clojure bằng cách sử dụng danh sách, tôi nhận được một số số nil s ở cuối.Lặp qua các vectơ

(def myVec [1,2,3]) 

user=> (for [x myVec] (println x)) 
(1 
2 
3 
nil nil nil) 

tôi nhận được điều tương tự sử dụng map

user=> (map println myVec) 
(1 
2 
3 
nil nil nil) 

những gì gây ra nill được in trong những trường hợp này?

+2

sử dụng (liềuq [x myVec] (println x)) – BLUEPIXY

Trả lời

6

Những người nil là giá trị trả lại là println. Mỗi lần bạn gọi

(println "something") 

chức năng println in something trên đầu ra tiêu chuẩn, và sau đó trả về nil. Hiệu ứng tổng thể trong mã của bạn là bạn thấy tất cả các hiệu ứng phụ (I/O) của tất cả các yêu cầu println, sau đó REPL in giá trị trả lại đến từ mỗi và mọi lệnh gọi (ví dụ: ba lần nil).

9

formap tạo trình tự lười biếng mới với mọi phần tử trong vectơ gốc được thay thế bằng kết quả của (println element) và println trả lại không.

Bạn không được sử dụng formap để thực hiện các tác dụng phụ (như in) trên các phần tử. Sử dụng doseq cho điều đó.

+0

Một chút nhầm lẫn xuất phát từ thứ tự dữ liệu được in ra. Dấu ngoặc đơn ban đầu được in như một phần của danh sách (map (println ...)) trả về, sau đó bạn nhận được đầu ra của mỗi println, sau đó các nils là một phần của danh sách (map (println ...)) . Nếu bạn chuyển sang sử dụng liều lượngq, hoặc nếu bạn (doall (bản đồ (println ...))), kết quả sẽ ít mơ hồ hơn một chút vì bạn sẽ thấy tất cả các bản in trước khi bạn nhận được giá trị trả lại. (dorun (bản đồ (println ...))) sẽ trở lại. Trừ khi tôi có dorun và doall đảo ngược. –

+4

@ SavanniD'Gerinel Những điều bạn đang nói là mơ hồ đúng, nhưng sai trong hầu hết các thông tin cụ thể. Mọi thứ xuất hiện theo thứ tự "sai" bởi vì trình tự được chunked, không phải vì repl in các hiệu ứng phụ trước các giá trị: nếu bạn có một chuỗi unchunked như '(mất 10 (iterate # (inc (doto% println)) 0)) ', bạn sẽ thấy giá trị trả về xen kẽ với kết quả in. Tương tự như vậy nếu bạn có một danh sách lớn hơn một đoạn duy nhất (nói, kích thước 50), bạn sẽ nhận được một loạt các bản in, sau đó là một loạt các giá trị, sau đó nhiều bản in ... – amalloy

+0

Đó là thông tin. Ý chính của những gì tôi nói là bạn không thể dự đoán được thứ tự mà mọi thứ đã được in ra, nhưng ngay cả điều đó cũng không chính xác khi bạn nói đến điều này. Vì nó là viết tắt, tôi chỉ trở nên nhận thức được chunking một vài ngày trước. –

1

nil là giá trị được trả về bởi println để bạn thấy các dòng được in theo sau là danh sách ánh xạ giá trị nil được ánh xạ.