函數式程式設計可以說是非常古老的程式設計方式,但是近年來函數式程式設計越來越受到人們的關注。不管是Google力推的Go、學術派的Scala與Haskell,還是Lisp的新語言Clojure,這些新的函數式程式語言都越來越受到人們的關注。
當然不僅是後端函數式程式語言層出不窮,前端也不甘示弱。雖然前端瀏覽器只支援一種語言——JavaScript,但是能支援函數式程式設計的JavaScript函數庫越來越多,例如Functional JavaScript、Underscore、lodash等。不僅如此,還有一些能編譯成JavaScript的語言,能讓前端的函數式程式設計發揮到極致,例如Haskell的PureScript、Scala的Scalajs、Clojure的ClojureScript。
我上二段都以Clojure結尾,是因為我喜歡把重點留到最後。Clojure獨特於其他語言,它既是一種新的語言、一種函數式程式設計範式的語言,又流淌著古老的血液——Lisp。這是我選擇用Clojure來詮釋函數式程式設計的原因之一。
為什麼我要選JavaScript作為函數式程式設計的目標?Michael Fogus用200多頁向大家展示了不一樣的Functional JavaScript程式設計方式,可惜Fogus作為ClojureScript編譯器的貢獻者,竟然選擇了Underscore作為函數庫,直接導致無法完全展示JavaScript所能達到的函數式程式設計能力。有趣的是,ClojureScript的作者把ClojureScript的不可變(Immutable)資料結構移植到了JavaScript,這徹底將JavaScript 的函數式程式設計提升到用其他函數庫都完成不了的新高度。不僅如此,Mozilla的Sweet.js(https://github.com/mozilla/sweet.js)更是完成了另一個突破——JavaScript的macro,它雖然不能算是函數式的概念,但也算是Lisp語言的一項獨門絕技了。
這一切的一切,都讓我忍不住要幫Fogus出一本續集,用JavaScript實現其他函數式程式語言如Clojure甚至是Haskell,讓大家進一步感受用JavaScript這門不完美的語言同樣可以撰寫出優雅的函數式程式,以不一樣的方式思考和解決問題。於是不管你是想轉行JavaScript的Clojure開發者,還是想了解Clojure或函數式程式設計的JavaScript開發者,都可以在此找到一些啟發。
本書的組織結構
第1章
將介紹JavaScript的基本函數式背景,簡要地介紹為什麼要關心函數式程式設計,為什麼說Underscore不夠函數式,JavaScript要作為完整的函數式語言還缺些什麼?
第2章
主要介紹Clojure的集合資料結構。這是本書極重要的章節,可以說函數式程式設計最基本、最重要的就是集合操作。本章涵蓋如何操作集合、惰性求值與惰性序列。
第3章
在了解持久性資料結構後,我們可能會產生疑惑,如果資料結構都是不可變的,那麼循環該怎麼寫呢?本章就是要解開各種使用不可變資料結構的疑惑,用這些不可變資料結構可以切換一種程式設計的思維方式。
第4章
nderscore並不利於函數組合,但是函數組合其實是函數式程式設計最重要的思想。本章將詳細介紹為什麼說Underscore錯了,而為什麼要喜歡上柯里化,以及Clojure 1.7新推出的Transducer又是如何幫助我們更容易組合出更高效的函數。
第5章
我極不願意把Macro翻譯成巨集。巨集特別容易讓人以為是C 語言裡面那個#define巨集,雖然都是巨集,但其實說的Macro不是一個等級的。Macro是Lisp語言之所以特別的原因之一。本章我們就來看看到底什麼是、為什麼,以及如何在JavaScript中使用Macro。
第6章
這裡說的模式比對包含兩種:一種是按位置或key比對集合,取出對應資料。另一種是Haskell風格的對函數參數的模式比對。本章篇幅比較小,因為模式比對並不是Clojure(也不是JavaScript)的主要模式,儘管在一些有強大類型系統的函數式語言(Scala、Haskell)中比較重要。
第7章
Monad這個範疇裡出來的神秘玩意,但你可能沒有注意,其實這在前端世界早都被玩膩了。本章將介紹Monad和它的朋友們,並且將帶你體驗JavaScript的Promise,以及Reactive程式設計。
第8章
平行處理程式設計一直是令人頭疼的程式設計方式,直到Clojure和Go的出現,徹底改變了我們平行處理程式設計的方式。而對於單執行緒的JavaScript,以事件循環為基礎的平行處理模型也一直困擾著我們,到底能從Clojure學些什麼,可以使我們的前端平行處理程式設計之路更順暢一些呢?本章將帶你熟悉平行處理、JavaScript的平行處理模型,以及CSP平行處理模型。