2013-07-05 35 views
1

我只理解了reducer談話中的幾個部分,一個是數據結構可以實現接口並能夠本地轉換,而不會先變成LazySeqclojure的reducer如何工作原生JavaScript對象/數組?

我希望能夠在clojurescript中使用本地JavaScript數組和對象,但我不太確定從哪裏開始。任何人都可以提供一個這樣做的例子嗎?

回答

2

在ClojureScript中,相關協議被稱爲IReduce,並且已經在標準庫中的數組中實現。相關的extend-type表格是here(現在鏈接到主站上的最新提交)。

還有IKVReduce使用reduce-kv,以及clojure.core.reducers/reduce在地圖參數的情況下。

您可以爲您希望以這種方式來改造原生對象提供的包裝:

(defn wrap-as-reducible [obj] 
    (reify 
    IReduce 
    (-reduce [this f] 
     ...) 
    (-reduce [this f init] 
     ...) 
    IKVReduce 
    (-kv-reduce [this f init] 
     ...))) 

實現任一或根據您的需要兩者IReduceIKVReduce

直接實現無論是在一般的「本地對象」的協議可能不是一個好主意,因爲這等於提供這將使用於還原性意義等

+0

感謝米哈爾檢查默認情況下。我有兩個問題:你能否詳細說明在默認情況下會發生什麼事情以進行還原性檢查,其次,如果我真的想在本機對象上使用clojure函數,你會建議我做些什麼...... ie(into(array)[1 2 3]) – zcaudate

+0

我關於默認情況的觀點是,如果您爲協議提供了一個,那麼它將用於任何不屬於更具體情況的對象,因此甚至可以使用ClojureScript類型的對象來減少由於意圖的語義('Atom',比如說)突然變得可以減少,所以沒有意義。至於'(into(array)...)',就像Clojure一樣,這裏有'into-array'。 –

+0

啊,好吧。所以擴展對象並不好。數組如何?我認爲他們應該安全地使用協議進行擴展 – zcaudate