译者序
第1版赞誉
第2版序言
第1版序言
关于本书
致谢
第1章 Clojure简介1
1.1 Clojure的概念以及采用的原因1
1.1.1 Clojure:现代化的Lisp语言2
1.1.2 Clojure:务实的函数式编程3
1.1.3 JVM之上的Clojure5
1.2 语言基础知识6
1.2.1 Lisp语法6
1.2.2 括号8
1.3 宿主互操作性:JVM速成教程9
1.3.1 Java类型、类和对象10
1.3.2 点(.)和new运算符11
1.3.3 线程和并发性12
1.4 小结12
第2章 Clojure要素:数据结构和函数14
2.1 在REPL上编码14
2.1.1 Clojure REPL15
2.1.2 “Hello, world!”16
2.1.3 用doc、find-doc和apropos查找文档17
2.1.4 Clojure语法的另外几个要点19
2.2 Clojure数据结构21
2.2.1 nil、真值和假值21
2.2.2 字符和字符串22
2.2.3 Clojure数值22
2.2.4 符号和关键字23
2.2.5 列表25
2.2.6 向量26
2.2.7 映射28
2.2.8 序列30
2.3 程序结构31
2.3.1 函数31
2.3.2 let形式32
2.3.3 do的副作用33
2.3.4 读取器宏34
2.4 程序流程35
2.4.1 条件35
2.4.2 逻辑函数37
2.4.3 函数式循环40
2.4.4 串行宏45
2.5 小结49
第3章 Clojure构件50
3.1 元数据51
3.1.1 Java类型提示53
3.1.2 Java原始类型和数组类型54
3.2 Java异常:try和throw55
3.3 函数56
3.3.1 定义函数57
3.3.2 调用函数63
3.3.3 高阶函数64
3.3.4 编写高阶函数67
3.3.5 匿名函数69
3.3.6 关键字和符号70
3.4 作用域73
3.4.1 变量和绑定73
3.4.2 重温let形式78
3.4.3 词法闭包79
3.5 命名空间79
3.5.1 ns宏80
3.5.2 使用命名空间82
3.6 解构83
3.6.1 向量绑定84
3.6.2 映射绑定85
3.7 读取器字面量87
3.8 小结89
第4章 多重方法多态90
4.1 多态及其类型90
4.1.1 参数化多态91
4.1.2 随意多态91
4.1.3 子类多态93
4.2 用多重方法实现多态94
4.2.1 不使用多重方法时的情况94
4.2.2 使用多重方法实现随意多态95
4.2.3 多分派98
4.2.4 使用多重方法实现子类多态99
4.3 小结105
第5章 探索Clojure和Java互操作106
5.1 从Clojure中调用Java107
5.1.1 将Java类导入Clojure107
5.1.2 创建实例108
5.1.3 访问方法和域108
5.1.4 宏和句点特殊形式109
5.1.5 有助于使用Java的Clojure宏112
5.1.6 实现接口和扩展类114
5.2 将Clojure代码编译为Java字节码115
5.2.1 示例:两个计算器的故事116
5.2.2 用gen-class和gen-interface创建Java类和接口118
5.3 从Java调用Clojure122
5.4 小结123
第6章 状态和并发的世界124
6.1 状态存在的问题125
6.1.1 共享状态的常见问题125
6.1.2 传统解决方案125
6.2 标识与值的分离127
6.2.1 不可变值128
6.2.2 对象和时间129
6.2.3 不可变性和并发性130
6.3 Clojure的方法130
6.3.1 不可变性与性能131
6.3.2 托管引用132
6.4 引用132
6.4.1 创建引用132
6.4.2 引用突变133
6.4.3 软件事务内存135
6.5 代理137
6.5.1 创建代理137
6.5.2 代理突变137
6.5.3 使用代理139
6.5.4 STM事务中的副作用141
6.6 原子141
6.6.1 创建原子142
6.6.2 原子突变142
6.7 变量143
6.7.1 创建变量和根绑定143
6.7.2 变量绑定144
6.8 状态及其统一访问模型145
6.8.1 创建145
6.8.2 读取145
6.8.3 突变145
6.8.4 事务146
6.8.5 监视突变146
6.9 决定使用哪种托管引用类别147
6.10 future和promise148
6.10.1 future148
6.10.2 promise149
6.11 小结150
第7章 通过宏发展Clojure151
7.1 宏的基础知识152
7.1.1 文本替换152
7.1.2 unless示例153
7.1.3 宏模板156
7.1.4 回顾:为什么使用宏160
7.2 Clojure内部的宏161
7.2.1 comment161
7.2.2 declare161
7.2.3 defonce162
7.2.4 and162
7.2.5 time163
7.3 编写自己的宏163
7.3.1 infix164
7.3.2 randomly164
7.3.3 defwebmethod165
7.3.4 defnn166
7.3.5 assert-true167
7.4 小结169
第8章 函数式编程深入研究170
8.1 使用高阶函数170
8.1.1 收集函数结果171
8.1.2 对一系列事物进行归纳173
8.1.3 过滤一系列事物174
8.2 部分应用175
8.2.1 函数适配176
8.2.2 定义函数179
8.3 闭包180
8.3.1 自由变量与闭包180
8.3.2 延迟计算与闭包181
8.3.3 闭包与对象182
8.3.4 一个Clojure对象系统184
8.4 小结196
第9章 协议、记录和类型197
9.1 表达式问题197
9.1.1 建立示例场景198
9.1.2 对表达式问题的仔细观察和一些潜在的解决方案201
9.1.3 Clojure多重方法解决方案202
9.2 研究表达式问题的运算端204
9.2.1 def-modus-operandi204
9.2.2 detail-modus-operandi205
9.2.3 跟踪你的操作方法205
9.2.4 解决方案的错误处理和故障点211
9.3 用协议研究表达式问题的数据类型方面211
9.3.1 defprotocol与extend-protocol212
9.3.2 用defrecord、deftype和reify定义数据类型217
9.4 小结222
第10章 测试驱动开发及其他223