Ответ 1
На этот вопрос есть два ответа. Чтобы ответить на ваш конкретный вопрос: в самом коде, который вы только что опубликовали, ничего не случилось: он работает нормально. (set! *print-meta* true)
и повторите попытку, и вы увидите аннотацию метаданных. Обычно это не печатает.
Но, в общем, это неправильный способ сделать что-то из макроса, и у вас скоро появятся проблемы. Помните, что вы не хотите метаданных в формах, которые оценивает макрос, вам нужны метаданные в тех формах, которые генерирует макрос. Таким образом, более точное решение заключается в использовании with-meta
для символов или форм, к которым вы хотите присоединить метаданные, или, если они являются предоставленными пользователем формами, вы обычно должны использовать vary-meta
, чтобы вы не отбрасывали метаданные, которые они добавили явно. Например,
(defmacro with-image [name & body]
(let [tagged-name (vary-meta name assoc :tag `BufferedImage)
`(let [~tagged-name (create-buffered-image)
[email protected])))
(with-image i (.getRGB i 0 0))