2012-09-14 35 views
12

我試着做以下Clojure中如何映射Clojure中的宏?

(map future exprs) 

要獲得未來令牌的序列。不幸的是,這個錯誤是因爲future本身就是一個宏而不是函數。

有沒有辦法使這項工作,同時仍然保持map語法?我寧願不使用for宏(就像個人風格一樣)。

我想我正在尋找mmap或宏觀地圖。

+3

您是否嘗試過使用lambda? – Marcin

回答

15

正如馬爾辛已經指出,使用lambda(匿名函數)

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) 

編輯

順便說一句,如果你使用map創建一串任務要執行在其他線程中,您可能會遇到問題。 map是懶惰的,直到有事要求時纔會創建期貨。您需要強制評估(當repl打印結果時發生在repl中)或找到其他方法。

+0

...所以使用'mapv'而不是'map'? ...'(defn defer [exprs](mapv#(future%)exprs))' – Thumbnail

+0

您可以強制進行評估。 '(into [](map#(...)xxx)'我認爲dorun也是爲此目的而存在的,儘管此時此刻沒有時間去查看它 – Bill

+5

'doall'就是你想要的。'dorun'忘記序列,因爲它意識到它。 – Thumbnail