Я хотел бы установить группу полей в объекте Java из Clojure без использования отражения во время выполнения.
Это решение (скопировано с одного решений) близок к тому, что мне нужно:
(defmacro set-all! [obj m]
`(do ~@(map (fn [e] `(set! (. ~obj ~(key e)) ~(val e))) m) ~obj))
(def a (java.awt.Point.))
(set-all! a {x 300 y 100})
Это работает нормально, но я хочу, чтобы макрос мог обрабатывать карту полей и значений, переданных как переменную или как локальную привязку (т.е. не передаваемую непосредственно в макрос, как указано выше). Поля должны быть представлены в виде ключевых слов, поэтому следующее должно работать:
(def a (java.awt.Point.))
(def m {:x 300 :y 100})
(set-all! a m)
Я не могу понять, как это сделать с помощью set! и специальная точечная форма в макросе (или любое решение, которое работает, как указано выше, без использования отражения во время выполнения).