2009-07-23 44 views
7

Tôi có một chức năng được gọi là chương trình hiển thị hộp thoại có tin nhắn. Tôi cần phải ánh xạ chức năng này cho tất cả các mục trong alist. Nhưng Clojure không cho tôi thấy bất kỳ tin nhắn nào. Tôi đang làm gì sai?Tại sao Clojure không thực thi chức năng này?

(defn show[message] 
(. javax.swing.JOptionPane (showMessageDialog nil message))) 

(defn action[] 
    (map show '(HELLO Sweet love))) 

Trả lời

5

chức năng bản đồ không thực sự chạy hàm được ánh xạ trên mỗi bộ ghi của bộ sưu tập. thay vào đó nó trả về một ô 'lười biếng'. Điều này trông giống như danh sách liên kết đơn lẻ cổ điển của bạn với một khác biệt rất quan trọng, dữ liệu trong mỗi ô được tính tại thời điểm nó được đọc không phải là thời gian được xác định (kết quả này được lưu trữ để đọc sau này). Vì vậy, để có chức năng thực sự chạy, bạn phải đọc kết quả của việc chạy hàm. Bởi vì trong trường hợp này bạn không chăm sóc về kết quả của hàm duy nhất mà nó chạy clojure cung cấp một chức năng bao bọc lớn được gọi là

(dorun .... insert your map here ....) 

rằng sẽ tạo ra bản đồ, đọc kết quả và kịp thời ném chúng ra với ra lãng phí bộ nhớ lưu trữ chúng cho sau này.

Nếu bạn định vị một hàm có kết quả bạn muốn giữ thì hãy sử dụng liều lượng thay vào đó.

+0

Cảm ơn câu trả lời chi tiết. Tất cả các danh sách trừu tượng đều lười biếng? Làm thế nào để tôi biết cái nào là cái nào và cái nào không? – unj2

+0

tôi tin rằng tất cả chúng đều ngoại trừ ngược lại, mặc dù vectơ có chức năng (rsec [1 2 3]) tạo ra giây bắt đầu ở cuối thường giải quyết vấn đề đó. –

7

map lười. Không có gì sẽ được đánh giá cho đến khi bạn buộc nó được đánh giá. Hoặc là (dorun (action)) hoặc sử dụng doseq thay vì map.

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