У меня есть следующий макрос:расширяющие макросы в макросах
(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)))))
Учитывая, что модель является класс Java с addChild
функции. Я хотел бы расширить defgom
в
(let [*gensym* (Model.)]
(.addChild *gensym* (first body))
(.addChild *gensym* (second body))
...
(.addChild *gensym* (last body)))
При оценке, то add-children
макросъемки дает правильный результат (список .addChild
). Но я не могу оценить его в макросе defgom
. Я получаю сообщение «Не знаю, как создать ISeq из: clojure.lang.Symbol». Я пробовал с ~
или [email protected]
(учитывая, что add-children
возвращает список), но никто не работал.
Как правильно развернуть макрос внутри макроса?
PS: Я знаю, что могу сделать это с помощью функции, а не макроса add-children
, но я хочу знать, можно ли это сделать с помощью макроса.