2012-09-14 36 views
12

Tôi cố gắng để làm như sau trong ClojureTôi làm cách nào để ánh xạ macro trong Clojure?

(map future exprs) 

Để có được một seq các thẻ tương lai. Thật không may điều này sai bởi vì future chính nó là một macro, không phải là một chức năng.

Có cách nào để thực hiện công việc này trong khi vẫn duy trì cú pháp map không? Tôi không muốn sử dụng macro for (chỉ là vấn đề về phong cách cá nhân).

Tôi cho rằng tôi đang tìm kiếm mmap hoặc bản đồ macro.

+3

Bạn đã thử sử dụng lambda chưa? – Marcin

Trả lời

15

Như đã nêu bởi Marcin, sử dụng một lambda (chức năng ẩn danh)

user=> (map and [true false 0 nil]) 
java.lang.Exception: Can't take value of a macro: #'clojure.core/and (NO_SOURCE_FILE:1) 
user=> (map #(and %) [true false 0 nil]) 
(true false 0 nil) 

chỉnh sửa

Bằng cách này, nếu bạn đang sử dụng map để tạo ra một loạt các nhiệm vụ được thực hiện trong các chủ đề khác, bạn có thể gặp sự cố. map là lười biếng, và tương lai sẽ không được tạo ra cho đến khi một cái gì đó yêu cầu họ. Bạn sẽ cần phải buộc nó được đánh giá (đó là những gì xảy ra trong repl khi repl in kết quả) hoặc tìm một số cách khác.

+0

... vì vậy hãy sử dụng 'mapv' thay vì' map'? ... '(defn trì hoãn [exprs] (mapv # (tương lai%) exprs))' – Thumbnail

+0

Bạn có thể bắt buộc đánh giá với ví dụ: '(vào [] (bản đồ # (...) xxx)' Tôi nghĩ rằng dorun cũng tồn tại cho mục đích này là tốt.Không có thời gian để tìm nó lên tại thời điểm này mặc dù – Bill

+5

'doall' là những gì bạn muốn 'dorun' quên chuỗi khi nó nhận ra nó – Thumbnail

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