2011-01-02 15 views
9

Java nesnesinde birçok farklı alanı ayarlayarak kodu nasıl etkileyebilirim? Ben dönem makro ve tam anlamıyla (ilk alan) değerlendirmeye çalışır Ancak bu işe yaramazFaktör Clojure kodunun bir Java nesnesinde birçok farklı alanın ayarlanması

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

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

için faktör istiyorum. Bu arada, tarla alanlarının iyi bir uygulama olmadığını anlıyorum. Eski kod ile çalışmam gerek.

cevap

7

deneyin - Eğer gerçekten başka seçeneği varsa ve fakat gerek Bunun bir faktörü, bu gibi bir makro yapardı:

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

İfade verme nesnesinin herhangi bir yan etkisi olması durumunda, gensime ihtiyaç vardır.

Örnek kullanım:

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]> 
5

Sen deneyebilirsiniz:

(defmacro set-all! [obj m] 
    `(do [email protected](map (fn [e] `(set! (. ~obj ~(key e)) ~(val e))) m) ~obj)) 

Örnek:

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

Macroexpand-hepsi: belirleyiciler kullanmak

(do (set! (. a x) 9) 
    (set! (. a y) 7) 
    a) 
+0

Böyle yöntemler mevcuttur. – chris

+0

Ah, alanları ayarlıyorsunuz. Dikkat etmemek için benim suçum. Cevabımı güncelledim. – Psyllo

İlgili konular