(defmacro empties [& args]
(doseq [arg args]
`(ty ~arg)))
(empties Base Person Animal)
;equivalent to:
;(ty Base)
;(ty Person)
;(ty Animal)
Это неправильно. Ваш empties
вызов означает, что функция расширения макроса для empties
получает в качестве аргументов символы Base
, Person
и Animal
. Затем он оценивает вызов макроса ty
для каждого, но ничего не возвращает, так как doseq
всегда возвращает ноль. Итак, расширенный код этого вызова empties
равен нулю. Вам нужно вернуть одну форму из вашей макрофункции. Вы должны обернуть несколько форм в do
и фактически вернуть все подчиненные формы к этому:
(defmacro empties [& args]
`(do ~@(map (fn [arg]
`(ty ~arg))
args)))