我正在编写一个Clojure宏,它应该接受一个映射,其中一些代码为值,并带有一个键。
稍后我想根据提供的密钥评估代码。
在此之前如何避免评估地图值? 我不希望引用整个地图,因为我需要评估密钥。
我不想传递引用的代码语法。
有没有办法让宏引用地图内的值?
答案 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)}