本书从零开始,将Haskell的Parsec解释器移植到Java和Scala,并通过详细的程序实例,深入浅出地介绍了组合子逻辑这个函数式编程的基本范式,给读者展示了Parsec组合子的原理、实现和应用。阅读本书,读者不但可以掌握Parsec解释器的实现方法,而且可以加深对Parsec组合子的理解。本书也可以作为学习Java和Scala编程语言的补充教材。
中国人自己实现和维护的开源项目,成功将Haskell的Parsec解释器移植到Java和Scala。
本书将利用组合子逻辑实现一个简单的LISP解释器。什么是组合子逻辑?一般来说组合子逻辑是指一类函数式编程语言的编程模式,它将具有同一功能接口的不同逻辑功能(算子)组合为新的、更复杂的逻辑,同时保留同样的功能接口,使接口具有外在的一致性。这是函数式编程中的一个基本范式。在面向对象的设计模式中,也有一些类似的设计思想。
不少函数式编程语言的文本分析工具是用组合子实现的,例如Haskell的Parsec和Scala的Parser.Combinators库。这是因为组合子很适合表达抽象模式,例如重复、间隔、顺序依赖等。组合子的这种特性使其可应用于各种各样的序列分析,包括非线性序列。
在学习Haskell的时候,我接触到了Parsec组合子。我结合手头的工作,开始尝试用一些常规编程语言实现Parsec算子。接下来十余年,我用Go、Swfit、Rust、Javascript、Python、Scala、Java等多种编程语言进行了探索和尝试,包括对Parsec解释器进行移植、实现规则引擎等。最后,主要做出了两项成果:用Scala开发出了Jaskell Core Parsec,以及专门为Java 8项目完成的Jasekll Parsec Java 8。这些成果也在我目前的工作中得到应用,收到了良好的效果。
本书从一些简单的例子入手,逐步介绍Parsec组合子的原理、应用和实现,重点是讲解它在Java和Scala中的实现方式,并给出相应的代码。因为示例解释器是分别用Java和Scala实现的,所以本书也可以作为Java和Scala语言的补充教材。
为了方便书籍的排版和印刷,我对书中代码做了一些格式上的处理,这些处理并不影响代码的功能。读者可以在书尾找到最新版本的代码。
刘鑫 资深程序员、架构师,2000年毕业于兰州大学数学系,从事软件开发工作二十多年,参与过电子商务、政务、网络游戏、互联网服务、移动应用等多个领域的软件项目开发。近十年来,致力于将Haskell的Parsec解释器移植到Go、Swfit、Rust、Javascript、Python、Scala、Java等编程语言中,主要成果包括基于Scala 2.x的Jaskell Core Parsec和基于Java 8的Jasekll Parsec Java 8。这些成果均已应用于实际软件开发,收到了良好的效果。
前言 1
第1章 环境准备
1.1 准备Java开发环境 4
1.2 准备Scala开发环境 6
1.3 JISP项目 6
1.4 SISP项目 7
第2章 开始构建简单的解释器
2.1 Hello REPL 10
2.2 Read Print Loop 13
2.3 算术表达式 14
第3章 数值解析
3.1 回顾 21
3.2 识别数值 24
3.3 前缀表达式 28
3.4 表达式求值 29
第4章 文本解析
4.1 文本和文本字面量 50
4.2 转义字符在字符串中包含字符串 51
4.3 整合解释器 57
第5章 解释器环境
5.1 命名作用域 59
5.2 变量定义 62
5.3 不可变命名 70
第6章 语句块和结构化编程
6.1 do 74
6.2 let 78
第7章 逻辑运算和比较运算
7.1 逻辑判定true?和false? 86
7.2 比较运算 95
第8章 逻辑分支
8.1 if的实现 106
8.2 cond的实现 112
第9章 定义函数
9.1 具名函数和匿名函数 120
9.2 递归与循环 124
9.3 静态绑定、动态绑定与闭包 134
第10章 List和Quote
10.1 Quote 148
10.2 宏和宏编程 154
10.3 LIST 156
10.4 工具函数 158
第11章 内置函数和解释器模块 177
第12章 Parsec的原理和组成
12.1 状态管理 183
12.2 算子 191
随书代码 225
后记 226