1
我只理解了reducer談話中的幾個部分,一個是數據結構可以實現接口並能夠本地轉換,而不會先變成LazySeq
。clojure的reducer如何工作原生JavaScript對象/數組?
我希望能夠在clojurescript中使用本地JavaScript數組和對象,但我不太確定從哪裏開始。任何人都可以提供一個這樣做的例子嗎?
我只理解了reducer談話中的幾個部分,一個是數據結構可以實現接口並能夠本地轉換,而不會先變成LazySeq
。clojure的reducer如何工作原生JavaScript對象/數組?
我希望能夠在clojurescript中使用本地JavaScript數組和對象,但我不太確定從哪裏開始。任何人都可以提供一個這樣做的例子嗎?
在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]
...)))
實現任一或根據您的需要兩者IReduce
和IKVReduce
。
直接實現無論是在一般的「本地對象」的協議可能不是一個好主意,因爲這等於提供這將使用於還原性意義等
感謝米哈爾檢查默認情況下。我有兩個問題:你能否詳細說明在默認情況下會發生什麼事情以進行還原性檢查,其次,如果我真的想在本機對象上使用clojure函數,你會建議我做些什麼...... ie(into(array)[1 2 3]) – zcaudate
我關於默認情況的觀點是,如果您爲協議提供了一個,那麼它將用於任何不屬於更具體情況的對象,因此甚至可以使用ClojureScript類型的對象來減少由於意圖的語義('Atom',比如說)突然變得可以減少,所以沒有意義。至於'(into(array)...)',就像Clojure一樣,這裏有'into-array'。 –
啊,好吧。所以擴展對象並不好。數組如何?我認爲他們應該安全地使用協議進行擴展 – zcaudate