【问题标题】:How can I map a macro in Clojure?如何在 Clojure 中映射宏?
【发布时间】:2012-09-07 05:00:10
【问题描述】:

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

(map future exprs)

获取未来令牌的序列。不幸的是,这是错误的,因为future 本身就是一个宏,而不是一个函数。

有没有办法在保持map 语法的同时完成这项工作?我宁愿不使用for 宏(仅作为个人风格问题)。

我想我正在寻找mmap 或宏图。

【问题讨论】:

标签: clojure macros higher-order-functions


【解决方案1】:

正如 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 是懒惰的,除非有人要求,否则不会创建期货。您需要强制对其进行评估(这是在 repl 打印结果时在 repl 中发生的事情)或找到其他方式。

【讨论】:

  • ...所以使用mapv 而不是map? ...(defn defer [exprs] (mapv #(future %) exprs))
  • 您可以使用 into 例如强制评估(into [] (map #(...) xxx) 我认为 dorun 也为此目的而存在。不过暂时没时间查。
  • doall 是你想要的。 dorun 在实现时忘记了序列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多