我正在编写一个Clojure宏,该宏应接受具有一些代码作为值并带有键的映射。
稍后,我想根据提供的密钥评估代码。
如何避免先评估地图值?我不希望整个地图都被引用,因为我需要对键进行评估。
我不想传递引用的代码语法。
有没有一种方法可以使宏引用地图中的值?
首先,正如我在两天前对您的问题的回答中所指出的那样,如果宏要以任何方式转换地图本身,则它必须将其作为地图文字接收,而不是像用符号命名地图一样-保持本地。好吧,严格来说,您也可以接受符号并对其全局编译时值进行评估;虽然无法获取运行时值。
如果您只愿意接受文字地图,则可以在其上使用常规的地图转换功能。例如,此宏将引用传入的地图文字中的值,而使键保持未引用状态:
(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] 删除。
我来说两句