【发布时间】:2016-04-21 22:29:07
【问题描述】:
我有以下宏:
(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)))))
考虑到 Model 是一个带有 addChild 函数的 Java 类。我想将defgom 扩展为
(let [*gensym* (Model.)]
(.addChild *gensym* (first body))
(.addChild *gensym* (second body))
...
(.addChild *gensym* (last body)))
在评估时,add-children 宏会给出正确的结果(.addChild 的列表)。但我无法在 defgom 宏中对其进行评估。我收到“不知道如何从:clojure.lang.Symbol 创建 ISeq”。我尝试使用~ 或~@(假设add-children 返回一个列表),但没有一个奏效。
如何在宏里面正确展开宏?
PS:我知道我可以使用函数而不是 add-children 宏来做到这一点,但我想知道是否可以使用宏来做到这一点。
【问题讨论】: