我有以下宏:
(defmacro add-children [this children]
(map (fn [child] (list '.addChild this child)) children))我想创建以下宏:
(defmacro defgom [name & body]
(let [sym (gensym)]
`(let [~sym (Model.)]
(add-children sym body)))))考虑到该模型是一个具有addChild函数的Java类。我想把defgom扩展到
(let [*gensym* (Model.)]
(.addChild *gensym* (first body))
(.addChild *gensym* (second body))
...
(.addChild *gensym* (last body)))计算时,add-children宏将给出正确的结果(.addChild列表)。但我无法在defgom宏中对其进行评估。我得到了一个“不知道如何从: ISeq创建clojure.lang.Symbol”。我尝试过使用~或~@ (考虑到add-children返回一个列表),但没有一个有效。
如何正确展开宏内部宏?
PS:我知道我可以用一个函数而不是add-children宏来完成它,但是我想知道是否可以用一个宏来完成它。
发布于 2016-04-21 23:06:22
只需将最后一行改为:
(add-children ~sym ~@body)https://stackoverflow.com/questions/36781550
复制相似问题