序
函數式程式設計可以說是非常古老的程式設計方式,但是近年來函數式程式設計越來越受到人們的關注。不管是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開發者,都可以在此找到一些啟發。