Предположим, я хочу определить две взаимно рекурсивные функции в локальной области видимости.Я могу сделать это с помощью letfn:
(letfn
[(f [x] (if (= x 0) (g x) true))
(g [x] (if (= x 1) (f x) false))]
(f 0))
Но letfn
довольно ограничен по сравнению с let
, так как он принимает только "спецификации функций", а не произвольные выражения.Мой вопрос: что, если я хочу присоединить метаданные (используя with-meta
) к f
и g
, чтобы в f
я мог читать метаданные g
, а в g
,Я могу прочитать метаданные f
?Возможно ли это в Clojure?
(Для контекста я пытаюсь реализовать макрос, подобный fn
, который автоматически присоединяет определенные метаданные к создаваемой функции. Я хотел бы, чтобы эти авто-аннотированные fn
быть инстанцируемым везде, где есть обычная функция Clojure, в том числе внутри letfn
. Но я не понимаю, как я могу определить letfn
-подобный макрос, который присоединяет метаданные, потому что в конечном итоге он должен был бы десагар до letfn
, который не может прикрепить метаданные.)