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