3

実行時にリフレクションを使用せずに、Clojure から Java オブジェクトにフィールドのグループを設定したいと考えています。

このソリューション(ソリューションの1つからコピーされたもの)は、私が求めているものに近いです:

(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})

これは問題なく動作しますが、var またはローカル バインディングとして渡されたフィールドと値のマップをマクロで処理できるようにしたいと考えています (つまり、上記のようにマクロに直接渡されません)。フィールドはキーワードとして表す必要があるため、次のように動作するはずです。

(def a (java.awt.Point.))
(def m {:x 300 :y 100})
(set-all! a m)

set を使用してこれを行う方法がわかりません。マクロ内の特別なドット形式 (または、実行時にリフレクションを使用せずに上記のように機能するソリューション)。

4

2 に答える 2