我正在读取yaml文件中的数据,这会产生如下数据:
{:test1 (1 2 3)}
Run Code Online (Sandbox Code Playgroud)
我可以查找密钥:test1
并获得clojure.lang.LazySeq
元素1 2 3
.但是当我想在宏中使用这些数据时,它会扩展为函数调用而不是引用列表.
例如:
(defmacro mmerge
[map1 map2]
`(assoc ~(merge map1 map2) :merged true))
(mmerge {:test1 (1 2 3)} {:test2 (4 5 6)})
Run Code Online (Sandbox Code Playgroud)
这扩展到:
(clojure.core/assoc {:test2 (4 5 6), :test1 (1 2 3)} :merged true)
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式让这个工作?
提前致谢
如果将map参数的值写为带引号的列表,则可以使用函数实现相同的功能:
(defn mmerge*
[map1 map2]
(assoc (merge map1 map2) :merged true))
(mmerge* {:test1 '(1 2 3)} {:test2 '(4 5 6)})
;= {:merged true, :test2 (4 5 6), :test1 (1 2 3)}
Run Code Online (Sandbox Code Playgroud)
如果你仍然想要一个宏,你需要引用merge
宏返回的表格中的操作结果(或者如果只引用列表,@ fl00r提到它绝对正确:P):
(defmacro mmerge
[map1 map2]
`(assoc '~(merge map1 map2) :merged true))
Run Code Online (Sandbox Code Playgroud)
这导致以下宏展开:
(clojure.core/assoc '{:test2 (4 5 6), :test1 (1 2 3)} :merged true)
Run Code Online (Sandbox Code Playgroud)