Factor Clojure 代码在 Java 对象中设置许多不同的字段

2024-03-31

如何在 Java 对象中分解设置许多不同字段的代码?我想考虑因素

(set! (. employee name) "Chris")
(set! (. employee age) 100)
(set! (. employee salary) 5000)

to

(doseq [field '((name "Chris") (age 100) (salary 5000))]
  (set! (. employee (first field)) (second field)))

然而,这不起作用,因为句点是一个宏,并尝试按字面意思评估(第一个字段)。顺便说一句,我知道设置字段不是一个好的做法。我需要与遗留代码进行互操作。


尝试使用设置器 - 但如果您别无选择并且确实需要将其排除在外,则可以使用像这样的宏:

(defmacro set-all [object & fields-and-values]
  (let [obj-sym (gensym)] 
    `(let [~obj-sym ~object]
        ~@(for [[field value] (partition 2 fields-and-values)]
           `(set! (. ~obj-sym ~field)
                  ~value)))))

如果生成对象的表达式有任何副作用,则需要 gensym。

用法示例:

user> (def p (java.awt.Point.))
#'user/p
user> (set-all p x 4 y 5)
5
user> p
#<Point java.awt.Point[x=4,y=5]>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Factor Clojure 代码在 Java 对象中设置许多不同的字段 的相关文章

随机推荐