2016-04-21 3 views
0

У меня есть следующий макрос:расширяющие макросы в макросах

(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, но я хочу знать, можно ли это сделать с помощью макроса.

ответ