Clojure 1.7引入Transducers,提高跨平臺支持度

eg756 9年前發布 | 10K 次閱讀 Clojure
 

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

 本文由用戶 eg756 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!