У меня возникли проблемы с написанием макросов, которые используют деструктивные аргументы. Вот пример:Прохождение деструктурированных аргументов через макросы
(defmacro defny
[n args & forms]
`(defn ~n ~args [email protected]))
(defmacro defnz
[n f args & forms]
`(defn ~n ~args
(do
(~f [email protected])
[email protected])))
(defny y
[{:keys [value] :as args}]
(println "Y ARGS" args)
(println "Y VALUE" value))
(defnz z y
[{:keys [value] :as args}]
(println "Z ARGS" args)
(println "Z VALUE" value))
Вот, у меня есть два макроса, defny который просто вызывает до defn и defnz, который делает то же самое, но дополнительно принимает другую функцию, которая вызывающую до тела функции с арг defnz в ,
Когда я призываю г, я ожидаю увидеть оба значения и арг распечатанного то же самое, но вместо этого я получаю:
(z {:value 1})
Y ARGS {:keys [1], :as {:value 1}}
Y VALUE nil
Z ARGS {:value 1}
Z VALUE 1
=> nil
Я могу понять, почему это происходит, деструктурированного арг {: клавиши [1 ]: как {: значение 1}} передаются y, но я не уверен, как исправить макрос defnz, чтобы деструктурированные аргументы могли быть переданы правильно.
Попробуйте 'macroexpand' и' MACROEXPAND-1', чтобы увидеть, какой код ваши макросы производят. –