Я понимаю, что первым правилом Macro Club является "Не использовать макросы", поэтому следующий вопрос больше рассматривается как упражнение в изучении Clojure, чем что-либо еще (я понимаю, что это не обязательно лучшее использование макросов).
Я хочу написать простой макрос, который действует как обертка вокруг обычного макроса (defn)
и завершает добавление некоторых метаданных к определенной функции. Поэтому я хотел бы иметь что-то вроде этого:
(defn-plus f [x] (inc x))
... разверните что-то вроде этого:
(defn #^{:special-metadata :fixed-value} f [x] (inc x))
В принципе, мне это не кажется трудным, но у меня возникают проблемы с приведением в соответствие специфики правильной обработки [args]
и других форм в определенной функции.
В качестве бонуса, если возможно, я хотел бы, чтобы макрос мог обрабатывать все разрозненные формы defn (т.е. с или без докстеров, множественных определений arity и т.д.). Я видел некоторые вещи в пакете clojure-contrib/def
, который выглядел, возможно, полезным, но было сложно найти пример кода, который их использовал.