如何避免在宏中评估映射值?

阿莫·塔尔帕利卡(Amogh Talpallikar)

我正在编写一个Clojure宏,该宏应接受具有一些代码作为值并带有键的映射。

稍后,我想根据提供的密钥评估代码。

如何避免先评估地图值?我不希望整个地图都被引用,因为我需要对键进行评估。

我不想传递引用的代码语法。

有没有一种方法可以使宏引用地图中的值?

米歇尔·马尔奇克(MichałMarczyk)

首先,正如我在两天前您的问题的回答中所指出的那样,如果宏要以任何方式转换地图本身,则它必须将其作为地图文字接收,而不是像用符号命名地图一样-保持本地。好吧,严格来说,您也可以接受符号并对其全局编译时值进行评估虽然无法获取运行时值。

如果您只愿意接受文字地图,则可以在其上使用常规的地图转换功能。例如,此宏将引用传入的地图文字中的值,而使键保持未引用状态:

(defmacro quote-vals [map-literal]
  (zipmap (keys map-literal)
          (map #(list 'quote %) (vals map-literal))))

从REPL:

(quote-vals {(+ 1 2) (+ 1 2) (+ 3 4) (+ 3 4)})
;= {7 (+ 3 4), 3 (+ 1 2)}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章