2014-09-24 43 views
3

有沒有辦法將字段訪問器轉換爲函數?我真的很驚訝,當我試圖做到這一點字段訪問器作爲clojure中的函數?

(map .x [o1 o2]) 

而是不得不這樣做

(defn x [o] (.x o)) 
(map x [o1 o2]) 

這似乎是相當必要的。有沒有辦法爲你創建這個功能?

+0

這是必要的,因爲字段不是jvm中的第一類對象,所以它們不能作爲參數提供給函數。爲了自動生成一個函數,你需要知道在編譯時哪個類的訪問者將被應用。 – noisesmith 2014-09-24 18:19:36

回答

1

你可以寫你自己的凌晨宏生成匿名函數:

(defmacro field [m] `(fn [x#] (. x# ~m))) 

然後,例如,

((field x) (java.awt.Point. 3 5)) 
;3 
+0

謝謝!我從未寫過一個宏。這應該是標準的。 – 2014-09-26 05:18:59

7

使用匿名fn

(map #(.x %) [o1 o2]) 
(map (fn [o] (.x o)) [o1 o2]) 

或者 memfn - 我讀過的一個匿名 fn優於此。我會盡力找到這篇文章。

(map (memfn x) [o1 o2]) 

編輯:斯圖哈洛韋有 this談談 memfn

+0

在memfn中,我得到'No matching method found found:x for class ...' – 2014-09-24 16:58:10

+0

另外「x」是一個字段而非方法。 – 2014-09-24 17:00:51

+0

@CristianGarcia我沒注意到。抱歉! – Kyle 2014-09-24 17:05:25