Помогите мне написать макрос Clojure, который автоматически добавляет метаданные в определение функции

Я понимаю, что первое правило Макроклуба - не используйте макросы, поэтому следующий вопрос предназначен скорее как упражнение в изучении Clojure, чем что-либо еще (я понимаю, что это не обязательно лучшийиспользование макросов).

Я хочу написать простой макрос, который действует как обертка вокруг обычного(defn) макрос и завершает добавление некоторых метаданных к определенной функции. Поэтому я хотел бы иметь что-то вроде этого:

(defn-plus f [x] (inc x))

... развернуть что-то вроде этого:

(defn #^{:special-metadata :fixed-value} f [x] (inc x))

В принципе, мне это не кажется сложным, но у меня возникают проблемы с определением[args] и другие формы в определенной функции для правильного анализа.

В качестве бонуса, если возможно, я бы хотел, чтобы макрос мог обрабатывать все разные формы defn (т. Е. С или без строк документации, множественные определения арности и т. Д.). Я видел некоторые вещи вclojure-contrib/def пакет, который выглядел, возможно, полезным, но было трудно найти пример кода, который использовал их.

Ответы на вопрос(1)

Ваш ответ на вопрос