2014-03-06 72 views
3

我是Clojure的新手,並創建了一個簡單的宏來調用某個Java類的某些方法,並將結果返回到Clojure地圖,並且這一切都正常。 (另外我知道bean函數,但我使用的類不是bean)。Java類到Clojure的地圖

我的問題是關於調用代碼。將Java'方法'作爲符號傳遞是更好的形式嗎?

我甚至不確定.toString是什麼類型(在調用代碼中)?這一切都有效,但不知道它的慣用Clojure。

(defmacro obj-to-map 
    [obj & body] 
    (let [afn (fn [[method kw]] 
       `(~kw (~method ~obj)))] 
    `(assoc {} [email protected](mapcat afn (partition 2 body))))) 

(obj-to-map "hello" .length :length .toString :value) 

=> {:value "hello", :length 5} 
+0

也許https://github.com/ngrunwald/gavagai也會有幫助。 – georgek

+0

是啊,看到這個項目,但它可能矯枉過正,我需要什麼。它也有趣,有時候爲自己工作這些事情! – tgrrr

回答

2

.toString等在調用代碼符號。

我認爲最好傳遞方法名稱並使用「。」來調用它。

(defmacro obj-to-map 
    [obj & body] 
    (let [afn (fn [[method kw]] 
       `(~kw (. ~obj ~method)))] 
    `(assoc {} [email protected](mapcat afn (partition 2 body))))) 

(obj-to-map "hello" length :length toString :value) 

=> {:value "hello", :length 5} 
+0

你說得對,看起來好多了。 「http://clojure.org/java_interop#Java Interop-The Dot特殊形式」 – tgrrr