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