Macros 在clojure宏中使用序列

Macros 在clojure宏中使用序列,macros,clojure,Macros,Clojure,我从yaml文件中读取数据,结果如下: {:test1 (1 2 3)} 我可以查找键:test1,得到一个clojure.lang.LazySeq,其中包含13元素。但是,当我想在宏中使用这些数据时,它会扩展为函数调用,而不是引用列表 例如: (defmacro mmerge [map1 map2] `(assoc ~(merge map1 map2) :merged true)) (mmerge {:test1 (1 2 3)} {:test2 (4 5 6)}) 这将扩展到:

我从yaml文件中读取数据,结果如下:

{:test1 (1 2 3)}
我可以查找键
:test1
,得到一个
clojure.lang.LazySeq
,其中包含
13
元素。但是,当我想在宏中使用这些数据时,它会扩展为函数调用,而不是引用列表

例如:

(defmacro mmerge
  [map1 map2]
  `(assoc ~(merge map1 map2) :merged true))

(mmerge {:test1 (1 2 3)} {:test2 (4 5 6)})
这将扩展到:

(clojure.core/assoc {:test2 (4 5 6), :test1 (1 2 3)} :merged true)
有没有可能以某种方式让它发挥作用


提前感谢

如果您将映射参数的值写入带引号的列表,则可以通过函数实现相同的功能:

(定义)*
[map1 map2]
(关联(合并map1 map2):合并为真)
(mmerge*{:test1'(1233)}{:test2'(456)})
;= {:合并为true,:test2(456),:test1(1233)}
如果仍然需要宏,则需要以宏返回的形式引用
合并
操作的结果(如果仅引用列表:p,则完全正确):

(反散乱宏)
[map1 map2]
`(关联“~(合并map1 map2):合并为true))
这导致以下宏观扩张:

(clojure.core/assoc'{:test2(456),:test1(1233)}:合并为true)

如果您将映射参数的值写入带引号的列表,则可以通过函数实现相同的功能:

(定义)*
[map1 map2]
(关联(合并map1 map2):合并为真)
(mmerge*{:test1'(1233)}{:test2'(456)})
;= {:合并为true,:test2(456),:test1(1233)}
如果仍然需要宏,则需要以宏返回的形式引用
合并
操作的结果(如果仅引用列表:p,则完全正确):

(反散乱宏)
[map1 map2]
`(关联“~(合并map1 map2):合并为true))
这导致以下宏观扩张:

(clojure.core/assoc'{:test2(456),:test1(1233)}:合并为true)

为什么这是宏?为什么这是宏?