在后端,函数式语言层出不穷。在前端,函数式最后的边界也已经被渐渐打破。Scala的Scala.js、Clojure的ClojureScript都试图同构移向前端。然而,原生JavaScript其实也可以通过丰富的库让前端的函数式编程一样的舒适和优雅。
本书涵盖了大部分函数式编程思想,包括JavaScript的函数式支持,Clojure风格的集合、递归、函数组合、宏、模式匹配、实用的Monads,以及前端的并发编程。
本书适合想要了解函数式编程的JavaScript程序员或者想学习JavaScript的函数式程序员阅读。
1、涵盖大部分函数式编程思想
2、幽默风趣,通俗易懂
3、是Clojure风格的JavaScript
4、用JavaScript实现了很多奇技淫巧
5、所有开发者都可以在本书中找到一些启发
序
函数式编程可以说是非常古老的编程方式,但是近年来函数式编程越来越受到人们的关注。不管是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开发者,都可以在此找到一些启发。但这并不是一本JavaScript入门的好书 。
前言
1.看本书之前你要知道
1)最好能看懂JavaScript代码
这既不是一本介绍Clojure的书,也不是一本介绍JavaScript的书,而是一本介绍如何用JavaScript函数式编程的书。其中一些函数式的思想和表现形式都借用了Clojure,因此叫作Clojure 风格的函数式JavaScript,但是并不要求在读本书前会Clojure ,而只需要能阅读JavaScript代码。如果你会Clojure,则可以完全忽略我解释Clojure代码的段落,当然JavaScript的部分才是重点。
2)你可能买错书了,如果你
? 想学JavaScript
这不是一本JavaScript的教科书,这里只会介绍如何用JavaScript进行函数式编程,所以如果想要系统地学习JavaScript,则学习《JavaScript语言精粹》可能已经足够了。另外,如果读者的英文水平好的话,则还有一本可以在线免费阅读的JavaScript Allonge。
? 想学Clojure
同样,这也不是一本Clojure的教科书,只含有一些用于阐述函数式编程思想的Clojure代码。你确实可以学到一些Clojure编程知识,但很可能是非常零碎且不完整的知识。如果想要系统地了解和学习Clojure,则非常推荐你阅读The Joy of Clojure ,另外,如果读者英文比较好,还有一本可以免费在线阅读的CLOJURE for the BRAVE and TRUE也非常不错。
? 是函数式编程的专家
如果你已经在日常工作或学习中使用Scala、Clojure或者Haskell等函数式语言编程的话,那么本书对你在函数式编程上的帮助不会太大。不过:这本书对缓解你从函数式语言迁移到JavaScript编程的不适应该是非常有效的。这也正是本书的目的之一。
2.准备环境
在开始阅读本书之前,如果你希望能运行书中的代码,可能需要一些环境的配置。而且书中的所有源码和运行方式都可以在本书的Github仓库 中找到。当然如果你使用Emacs(同时还配置了org babel的话)阅读本书的源码,对于大部分代码只需要光标放在代码处按c-c c-c即可。
? JavaScript
原生的JavaScript没有什么好准备的,可以通过Node或者Firefox(推荐)的Console运行代码。当然第5章会有一些使用Sweet.js写的Macro,这则需要安装Sweet.js。
– 安装Node/io.js
(1)下载Node.js。
(2)如果使用Mac,可以直接用Brew安装。
brew install node
# 或者
brew install iojs
– 安装Sweet.js
在安装完Node.js之后在命令行输入:
npm install -g sweet.js
? Clojure
书中的Clojure代码大都用来描述函数式编程的概念,当然如果想要运行书中的 Clojure 代码,首先需要安装JVM或者JDK ,至少需要1.6版本,推荐安装1.8版本。
– 安装 leiningen
leiningen是Clojure的包管理工具,类似于Node的Npm、Ruby的bundle、Python的pip。另外leiningen还提供脚手架的功能。可以通过官网的脚本安装 。Mac用户可以简单地使用brew install leiningen安装。
安装完成之后,就可以运行lein repl,打开repl,试试输入下列Clojure代码,你将会立马看见结果。
(+ 1 1)
;=> 2
– 编辑器
如果更喜欢使用编辑器来编辑更长的一段代码,我推荐非Emacs用户使用Light Table ,Intellij用户则使用cursive 。当然如果读者已经在使用Emacs,那就更完美了,Emacs cider mode 是Clojure编程不错的选择。
3.本书中的代码
书中的所有源码和运行方式都可以在本书的Github仓库 中找到,书中几乎所有的例子都以测试的形式完成。
4.反馈
如果你是开源贡献者,那么应该很习惯通过Github Issue9提交任何反馈,如果是Pull Request,那就更好了。当然如果没有使用过Github Issue也没有关系,这里 有非常详细的教程。
5.代码风格约定
本书的JavaScript代码都遵循Airbnb JavaScript Style Guide 中的ES5和React的风格约定。
6.本书的组织结构
第1章
将介绍JavaScript的基本函数式背景,简要地介绍为什么要关心函数式编程,为什么说Underscore不够函数式,JavaScript要作为完整的函数式语言还缺些什么?
第2章
主要介绍Clojure的集合数据结构。这是个无聊但是又很重要的章节,可以说函数式编程最基本、最重要的就是集合操作。本章会涉及如何操作集合、惰性求值与惰性序列。
第3章
在了解了持久性数据结构后,我们可能会产生疑惑,如果数据结构都是不可变的,那么循环该怎么写呢?本章就是要解开各种使用不可变数据结构的疑惑,用这些不可变数据结构可以切换一种编程的思维方式。
第4章
Underscore并不利于函数组合,但是函数组合其实是函数式编程最重要的思想。在这一章里面,我会详细介绍为什么说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并发模型。
7.本书使用的约定
本书使用以下字体排版约定。
1)楷体
表示新的术语。
2)等宽字体
代码清单,出现在段落之内则表示变量、函数名、关键字等。
3)粗体
重点概念。
4)下画线
需要填入的词,我可能已经帮大家填上了。
5)横线
可以忽略的词。