Вары, названные полностью определенными символами, не обязательно должны существовать при компиляции defmacro
. Это означает, что вы можете записать их непосредственно в свой макрос, и это будет работать до тех пор, пока ссылочные переменные будут существовать во время выполнения:
(defmacro defelem [name element]
`(defcard ~name
(package.cljs.ns/react-card
(r/as-element [~element]))))
Конечно, это означает, что компилятор не может защитить вас, если вы попытаетесь сослаться на несуществующую переменную, поэтому вам нужно быть немного более осторожным, чем обычно.
См. связанный вопрос: Как мне поступить с требуемым кодом Clojurescript из Clojurescript макросы?
Поскольку вы используете shadow-cl js, см. также свою собственную документацию по этому вопросу:
Поскольку макросы работать в CLJ, а не CL JS, псевдонимы пространства имен, настроенные вами в CL JS, не будут работать в макросе. Рекомендуется использовать полностью определенные имена, если вам нужен доступ к коду из других пространств имен.