在clojure宏中使用序列

Fin*_*inn 0 macros clojure

我正在读取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)

是否有可能以某种方式让这个工作?

提前致谢

jua*_*rro 5

如果将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)