如何避免在宏中评估地图值?

时间:2013-07-12 07:27:36

标签: clojure

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

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

在此之前如何避免评估地图值? 我不希望引用整个地图,因为我需要评估密钥。

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

有没有办法让宏引用地图内的值?

1 个答案:

答案 0 :(得分:1)

首先,正如我在两天前对your question的回答中指出的那样,如果宏要以任何方式转换地图本身,它必须以地图文字的形式接收它,而不是说,一个命名地图持有本地的符号。好吧,严格来说,您也可以接受符号并评估它们的全局编译时值;但是无法获得运行时值。

如果您只是接受文字地图,那么您可以使用常用的地图转换功能。例如,此宏将引用传入的映射文字中的值,同时保持键不加引号:

(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)}