如何在Clojure中映射宏?

14

我尝试在Clojure中执行以下操作

(map future exprs)
为了获取未来标记序列。不幸的是,这会出错,因为future本身是一个宏,而不是一个函数。
是否有一种方法可以使其在保持map语法的同时正常工作?我宁愿不使用for宏(仅出于个人风格考虑)。
我想我正在寻找一个mmap或宏映射。

3
你尝试过使用lambda吗? - Marcin
相关链接:https://dev59.com/gnE85IYBdhLWcg3wNgrk - David Tonhofer
1个回答

16
正如Marcin所说,使用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是惰性的,直到有人要求它们才会创建futures。您需要强制它被评估(这就是repl在打印结果时发生的事情),或找到其他方法。


...所以使用mapv代替map?...(defn defer [exprs] (mapv #(future %) exprs)) - Thumbnail
你可以使用 (into [] (map #(...) xxx) 强制求值。我认为 dorun 也可以用于此目的。不过我现在没有时间查找。 - BillRobertson42
6
"doall" 是您想要的。"dorun" 在执行时会忘记序列。 - Thumbnail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接