Clojure 在宏中展开宏
我有以下宏:Clojure 在宏中展开宏,clojure,macros,Clojure,Macros,我有以下宏: (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函
(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)))
计算时,addchildren
宏给出正确的结果(.addchildren
的列表)。但我无法在defgom
宏中计算它。我得到一个“不知道如何从clojure.lang.Symbol创建ISeq”。我尝试了~
或~@
(假设添加子项
返回一个列表),但都没有成功
如何在宏内部正确展开宏
PS:我知道我可以用一个函数而不是“添加子项”宏来完成,但我想知道是否可以用宏来完成。只需将最后一行更改为:
(add-children ~sym ~@body)
只需将最后一行更改为:
(add-children ~sym ~@body)