Clojure 1.7引入Transducers,提高跨平臺支持度
Cognitect的Alex Miller 說 :Transducers和reader conditionals是Clojure 1.7最重要的兩個特性。 Transducers 的目標是使不同的集合可組合算法轉換,而reader conditionals可以用來改善Clojure跨JVM和JavaScript平臺的可移植性。
Transducers
Transducers是一種減量函數轉換器(reducing function transformers),獲取一種減量函數并返回另一種的函數。減量函數僅僅是一種可以用來reduce的函數。Rich Hickey 解釋說: transducers的主要優勢是它們允許分離三個主要問題:
- 減量函數是什么;
- 應用在哪些集合中;
- reduce的輸入。
在Clojure 1.7中,為了支持Transducers,像map、cat、filter等大多數序列函數,在輸入集合中都添加了一個新的參數。例如,
(def tr1 (map f))
將會返回一個map transducer。此外,Transducers可以通過Comp函數組合:
(def xform (comp (filter odd?)(map inc)))
來提供一個新的Transducers。一旦你有了一個Transducers,你可以把它應用在幾個方面,例如矢量數據。
(Sequence Xform data)
使用Transducers函數替代sequence,你將會獲得跟將reduce應用在data上同樣的結果并獲得組合函數原型。
上面示例的主要好處是:如果使用簡單的組合功能,當它運行時,僅僅建立一個lazy sequence而不是三個。
Reader conditionals
Reader conditionals是Clojure 1.7引入的一種新的格式,可以由Clojure和ClojureScript加載,并可以應用在.cljc文件語境中。把多個Clojure平臺使用一種代碼庫作為目標的方法,使得擁有庫和應用程序成為可能,并且Reader conditionals提供的機制讓處理平臺特定代碼時更加容易。
類似于cond形式,Reader conditionals表達式允許為每一個平臺指定應該使用的平臺特定代碼。例如下面的表達式:
[1 2 #?@(:clj [3 4] :cljs [5 6])]
在Clojure上我們將會得到[1 2 3 4],在ClojureScript上是[1 2 5 6]。
Clojure 1.7除了Transducers和Reader conditionals,還 包含 了更多新的特性和增強功能。
查看英文原文: Clojure 1.7 Introduces Transducers, Improves Cross-platform Support