Для этого, по сути, вам нужно будет переписать макрос точно так же, как оригинал, просто подставив другое имя (для этого, конечно, вы должны использовать defmacro
). Это единственный способ, который возможен, поскольку макросы не возвращают значение, а просто записывают код, который впоследствии должен быть оценен.
Def требует привязки имени к значению, а не к блоку кода.
(определение символа init?)
Создает и интернирует или находит глобальную переменную с именем символа и пространством имен значения текущего пространства имен ( ns ). Если указан init, он оценивается, и корневая привязка var устанавливается на результирующее значение. Если init не указан, корневая привязка var не затрагивается. def всегда применяется к корневой привязке, даже если var привязан к потоку в точке, где вызывается def. def возвращает саму переменную (а не ее значение). Выдает исключение, если символ уже находится в пространстве имен и не сопоставлен с интернированной переменной.
с Clojure: Special Forms
Макросы не оценивают свои формы:
Макросы - это функции, которые манипулируют формами, позволяя использовать синтаксическую абстракцию. Если оператор вызова является символом, который называет глобальную переменную, которая является макро-функцией, то эта макро-функция вызывается, и передается неоцененным формам операндов [курсив мой]. Возвращаемое значение макроса затем оценивается на его месте.
от Clojure: Оценка
В общем, смысл макроса в том, чтобы задержать оценку, поэтому он не может предоставить значение для def
для привязки к символу.