Clojure编程乐趣
Michael Fogus 是Clojure/core成员,在分布式模拟、机器视觉及专家系统方面拥有丰富的经验。 Chris Houser是Clojure 的关键贡献者,曾实现了几个重要的特性。
Clojure是一门Lisp方言。它通过函数式编程技术,直接支持并发软件开发,得到众多开发人员的欢迎。 《Clojure编程乐趣》并非Clojure初学指南,也不是一本Clojure的编程操作手册,而是通过对Clojure详尽地探究,教授函数式的程序设计方式,帮助读者理解和体会Clojure编程的乐趣,进而开发出优美的软件。 全书分为5个部分共13章。第1部分是基础,包括第1章到第3章,从Clojure背后的思想开始,介绍了Clojure的基础知识,并带领读者初步尝试Clojure编程。第2部分包括第4章和第5章,介绍了Clojure的各种数据类型。第3部分是第6章和第7章,介绍了函数式编程的特性。第4部分包括第8章到第11章,分别介绍了宏、组合数据域代码、Clojure对Java的调用,以及并发编程等较为高级的话题。第5部分为第12章和第13章,探讨了Clojure的性能问题及其带给我们的思考。 《Clojure编程乐趣》适合有一定基础的Cl…
查看完整
查看完整
目 录
第1部分 基础
第1章 Clojure哲学 3
1.1 Clojure之道 4
1.1.1 简单 4
1.1.2 专注 5
1.1.3 实用 5
1.1.4 清晰 6
1.1.5 一致 7
1.2 为何(又一种)Lisp 8
1.2.1 优美 8
1.2.2 极度灵活 9
1.2.3 代码即数据 11
1.3 函数式编程 11
1.3.1 一个可行的函数式编程定义 11
1.3.2 函数式编程的内涵 12
1.4 Clojure为何不是面向对象的 12
1.4.1 定义术语 12
1.4.2 命令式“烘烤” 14
1.4.3 OOP提供的大多数东西,Clojure也有 14
1.5 小结 18
第2章 Clojure疾风式教程 19
2.1 标量 20
2.1.1 数字 20
2.1.2 整数 20
2.1.3 浮点数 21
2.1.4 有理数 21
2.1.5 符号 22
2.1.6 关键字 22
2.1.7 字符串 22
2.1.8 字符 22
2.2 组合起来:集合 23
2.2.1 list 23
2.2.2 vector 23
2.2.3 map 24
2.2.4 set 24
2.3 付诸实现:函数 24
2.3.1 调用函数 24
2.3.2 定义函数 25
2.3.3 用def和defn简化函数定义 26
2.3.4 以#()定义原位(in-place)函数 27
2.4 var 27
2.5 局部量、循环和block 28
2.5.1 block 28
2.5.2 局部量 28
2.5.3 循环 29
2.6 防止发生:quote 31
2.6.1 求值 31
2.6.2 quote 32
2.6.3 反quote 34
2.6.4 反quote拼接 34
2.6.5 auto-gensym 35
2.7 与Java互操作 35
2.7.1 访问静态类成员 35
2.7.2 创建Java实例 35
2.7.3 用.运算符访问Java实例成员 36
2.7.4 设置Java实例属性 36
2.7.5 …宏 36
2.7.6 doto宏 37
2.7.7 定义类 37
2.8 异常环境 37
2.9 命名空间 38
2.9.1 用ns创建命名空间 38
2.9.2 用:require加载其他命名空间 39
2.9.3 用:use加载和创建映射 40
2.9.4 用:refer创建映射 41
2.9.5 用:import加载Java类 41
2.10 小结 41
第3章 小试牛刀 43
3.1 真值 44
3.1.1 什么是真 44
3.1.2 不要创建布尔对象 44
3.1.3 nil vs. false 45
3.2 小心翼翼nil双关 45
3.3 解构 46
3.3.1 你的任务,你应该选择接受 47
3.3.2 解构vector 47
3.3.3 解构map 48
3.3.4 解构函数参数 50
3.3.5 解构vs.访问器方法 50
3.4 用REPL做试验 50
3.4.1 试验seq 51
3.4.2 试验图形化 52
3.4.3 知识汇总 53
3.4.4 出错之时 54
3.4.5 只为乐趣 55
3.5 小结 56
第2部分 数据类型
第4章 标量 61
4.1 理解精度 62
4.1.1 截断(Truncation) 62
4.1.2 提升(Promotion) 63
4.1.3 上溢(Overflow) 63
4.1.4 下溢(Underflow) 64
4.1.5 舍入错误(Rounding errors) 64
4.2 有理数 65
4.2.1 为什么是有理数 65
4.2.2 怎样才是有理数 66
4.2.3 有理数的合理性 67
4.3 使用关键字的时机 67
4.3.1 关键字与符号有怎样的差别 68
4.3.2 限定关键字 69
4.4 符号解析 70
4.4.1 元数据 71
4.4.2 符号与命名空间 71
4.4.3 Lisp-1 72
4.5 正则表达式——第二个问题 73
4.5.1 语法 73
4.5.2 函数 74
4.5.3 小心可变匹配器(matcher) 75
4.6 总结 75
第5章 组合数据类型 76
5.1 持久化、序列和复杂度 77
5.1.1 “你一直用着这个词。我认为,这并不意味着它就是你以为的含义” 77
5.1.2 序列术语及其含义 78
5.1.3 大O 81
5.2 vector:创建和使用其各种变体 82
5.2.1 构建vector 82
5.2.2 大vector 83
5.2.3 vector当做栈 86
5.2.4 使用vector而非reverse 87
5.2.5 子vector 87
5.2.6 vector当做MapEntry 88
5.2.7 vector不是什么 89
5.3 list:Clojure代码form的数据结构 90
5.3.1 像Lisp那样的list 90
5.3.2 list当做栈 91
5.3.3 list不是什么 91
5.4 如何使用持久化队列 91
5.4.1 什么都没有的队列 92
5.4.2 入队 93
5.4.3 获取 93
5.4.4 出队 93
5.5 持久化set 94
5.5.1 Clojure set的基本属性 94
5.5.2 用sorted-set保持set的顺序 95
5.5.3 contains? 96
5.5.4 clojure.set 96
5.6 思考map 98
5.6.1 hash map 98
5.6.2 以有序map保持键值的顺序 99
5.6.3 用数组map保持插入顺序 101
5.7 知识汇总:在序列里查找某项的位置 101
5.8 小结 104
第3部分 函数式编程
第6章 惰性与不变性 107
6.1 关于不变性 107
6.1.1 定义不变性 108
6.1.2 固步自封—不变性 108
6.2 设计一个持久化玩具 110
6.3 惰性 113
6.3.1 以“逻辑与”熟悉惰性 113
6.3.2 理解lazy-seq的秘诀 115
6.3.3 丢掉头 117
6.3.4 采用无限序列 118
6.3.5 delay和force宏 119
6.3.6 知识汇总:一个惰性的快速排序程序 121
6.4 小结 124
第7章 函数式编程 125
7.1 各种形式的函数 125
7.1.1 一等函数 126
7.1.2 高阶函数 129
7.1.3 纯函数 131
7.1.4 命名实参 132
7.1.5 使用前置条件和后置条件约束函数 133
7.2 闭包 135
7.3 递归思考 141
7.3.1 普通递归 141
7.3.2 尾递归和recur 143
7.3.3 勿忘trampoline 145
7.3.4 延续传递风格 147
7.4 知识汇总:A*寻路 149
7.4.1 A*实现 150
7.4.2 A*实现的笔记 153
7.5 小结 153
第4部分 大规模设计
第8章 宏 157
8.1 数据即代码即数据 158
8.1.1 语法quote、反quote和拼接 159
8.1.2 宏之经验谈 160
8.2 定义控制结构 161
8.2.1 不用语法quote定义控制结构 161
8.2.2 使用语法quote和反quote定义控制结构 162
8.3 组合form的宏 163
8.4 使用宏改变form 165
8.5 使用宏控制符号解析 168
8.5.1 回指 169
8.5.2 (具有争议地)有用的选择性名字捕获 170
8.6 使用宏管理资源 171
8.7 知识汇总:返回函数的宏 172
8.8 小结 175
第9章 组合数据与代码 176
9.1 命名空间 176
9.1.1 创建命名空间 177
9.1.2 只暴露所需 179
9.1.3 声明性包含和排除 181
9.2 以通用设计模式探索Clojure多重方法 182
9.2.1 组成部分 183
9.2.2 用法 184
9.2.3 以多重方法拯救 184
9.2.4 处理继承行为的特别继承 185
9.2.5 解析层次中的冲突 186
9.2.6 真正的最大功率任意分发 187
9.3 类型、协议和记录 188
9.3.1 记录 188
9.3.2 协议 191
9.3.3 用deftype从更原始的基础开始构建 199
9.4 知识汇总:国际象棋移动的流畅构建器 201
9.4.1 Java实现 201
9.4.2 Clojure实现 203
9.5 小结 205
第10章 Java.next 206
10.1 使用proxy动态生成对象 207
10.2 Clojure gen-class和GUI程序设计 211
10.2.1 命名空间作为类的规范 211
10.2.2 以Clojure探索用户界面设计与开发 214
10.3 Clojure同Java数组的关系 217
10.3.1 数组的类型:原生与引用 217
10.3.2 数组可变性 219
10.3.3 那个不幸的命名约定 220
10.3.4 多维数组 221
10.3.5 调用可变方法/构造函数 221
10.4 所有Clojure函数都实现…… 222
10.4.1 java.util.Comparator 222
10.4.2 java.lang.Runnable 223
10.4.3 java.util.concurrent.Callable 223
10.5 在Java API里使用Clojure数据结构 224
10.5.1 java.util.List 224
10.5.2 java.lang.Comparable 225
10.5.3 java.util.RandomAccess 225
10.5.4 java.util.Collection 225
10.5.5 java.util.Set 226
10.6 definterface 227
10.7 慎用异常 229
10.7.1 一点异常的背景 229
10.7.2 运行时异常vs.编译时异常 230
10.7.3 处理异常 231
10.7.4 定制异常 232
10.8 小结 233
^ 收 起
第1部分 基础
第1章 Clojure哲学 3
1.1 Clojure之道 4
1.1.1 简单 4
1.1.2 专注 5
1.1.3 实用 5
1.1.4 清晰 6
1.1.5 一致 7
1.2 为何(又一种)Lisp 8
1.2.1 优美 8
1.2.2 极度灵活 9
1.2.3 代码即数据 11
1.3 函数式编程 11
1.3.1 一个可行的函数式编程定义 11
1.3.2 函数式编程的内涵 12
1.4 Clojure为何不是面向对象的 12
1.4.1 定义术语 12
1.4.2 命令式“烘烤” 14
1.4.3 OOP提供的大多数东西,Clojure也有 14
1.5 小结 18
第2章 Clojure疾风式教程 19
2.1 标量 20
2.1.1 数字 20
2.1.2 整数 20
2.1.3 浮点数 21
2.1.4 有理数 21
2.1.5 符号 22
2.1.6 关键字 22
2.1.7 字符串 22
2.1.8 字符 22
2.2 组合起来:集合 23
2.2.1 list 23
2.2.2 vector 23
2.2.3 map 24
2.2.4 set 24
2.3 付诸实现:函数 24
2.3.1 调用函数 24
2.3.2 定义函数 25
2.3.3 用def和defn简化函数定义 26
2.3.4 以#()定义原位(in-place)函数 27
2.4 var 27
2.5 局部量、循环和block 28
2.5.1 block 28
2.5.2 局部量 28
2.5.3 循环 29
2.6 防止发生:quote 31
2.6.1 求值 31
2.6.2 quote 32
2.6.3 反quote 34
2.6.4 反quote拼接 34
2.6.5 auto-gensym 35
2.7 与Java互操作 35
2.7.1 访问静态类成员 35
2.7.2 创建Java实例 35
2.7.3 用.运算符访问Java实例成员 36
2.7.4 设置Java实例属性 36
2.7.5 …宏 36
2.7.6 doto宏 37
2.7.7 定义类 37
2.8 异常环境 37
2.9 命名空间 38
2.9.1 用ns创建命名空间 38
2.9.2 用:require加载其他命名空间 39
2.9.3 用:use加载和创建映射 40
2.9.4 用:refer创建映射 41
2.9.5 用:import加载Java类 41
2.10 小结 41
第3章 小试牛刀 43
3.1 真值 44
3.1.1 什么是真 44
3.1.2 不要创建布尔对象 44
3.1.3 nil vs. false 45
3.2 小心翼翼nil双关 45
3.3 解构 46
3.3.1 你的任务,你应该选择接受 47
3.3.2 解构vector 47
3.3.3 解构map 48
3.3.4 解构函数参数 50
3.3.5 解构vs.访问器方法 50
3.4 用REPL做试验 50
3.4.1 试验seq 51
3.4.2 试验图形化 52
3.4.3 知识汇总 53
3.4.4 出错之时 54
3.4.5 只为乐趣 55
3.5 小结 56
第2部分 数据类型
第4章 标量 61
4.1 理解精度 62
4.1.1 截断(Truncation) 62
4.1.2 提升(Promotion) 63
4.1.3 上溢(Overflow) 63
4.1.4 下溢(Underflow) 64
4.1.5 舍入错误(Rounding errors) 64
4.2 有理数 65
4.2.1 为什么是有理数 65
4.2.2 怎样才是有理数 66
4.2.3 有理数的合理性 67
4.3 使用关键字的时机 67
4.3.1 关键字与符号有怎样的差别 68
4.3.2 限定关键字 69
4.4 符号解析 70
4.4.1 元数据 71
4.4.2 符号与命名空间 71
4.4.3 Lisp-1 72
4.5 正则表达式——第二个问题 73
4.5.1 语法 73
4.5.2 函数 74
4.5.3 小心可变匹配器(matcher) 75
4.6 总结 75
第5章 组合数据类型 76
5.1 持久化、序列和复杂度 77
5.1.1 “你一直用着这个词。我认为,这并不意味着它就是你以为的含义” 77
5.1.2 序列术语及其含义 78
5.1.3 大O 81
5.2 vector:创建和使用其各种变体 82
5.2.1 构建vector 82
5.2.2 大vector 83
5.2.3 vector当做栈 86
5.2.4 使用vector而非reverse 87
5.2.5 子vector 87
5.2.6 vector当做MapEntry 88
5.2.7 vector不是什么 89
5.3 list:Clojure代码form的数据结构 90
5.3.1 像Lisp那样的list 90
5.3.2 list当做栈 91
5.3.3 list不是什么 91
5.4 如何使用持久化队列 91
5.4.1 什么都没有的队列 92
5.4.2 入队 93
5.4.3 获取 93
5.4.4 出队 93
5.5 持久化set 94
5.5.1 Clojure set的基本属性 94
5.5.2 用sorted-set保持set的顺序 95
5.5.3 contains? 96
5.5.4 clojure.set 96
5.6 思考map 98
5.6.1 hash map 98
5.6.2 以有序map保持键值的顺序 99
5.6.3 用数组map保持插入顺序 101
5.7 知识汇总:在序列里查找某项的位置 101
5.8 小结 104
第3部分 函数式编程
第6章 惰性与不变性 107
6.1 关于不变性 107
6.1.1 定义不变性 108
6.1.2 固步自封—不变性 108
6.2 设计一个持久化玩具 110
6.3 惰性 113
6.3.1 以“逻辑与”熟悉惰性 113
6.3.2 理解lazy-seq的秘诀 115
6.3.3 丢掉头 117
6.3.4 采用无限序列 118
6.3.5 delay和force宏 119
6.3.6 知识汇总:一个惰性的快速排序程序 121
6.4 小结 124
第7章 函数式编程 125
7.1 各种形式的函数 125
7.1.1 一等函数 126
7.1.2 高阶函数 129
7.1.3 纯函数 131
7.1.4 命名实参 132
7.1.5 使用前置条件和后置条件约束函数 133
7.2 闭包 135
7.3 递归思考 141
7.3.1 普通递归 141
7.3.2 尾递归和recur 143
7.3.3 勿忘trampoline 145
7.3.4 延续传递风格 147
7.4 知识汇总:A*寻路 149
7.4.1 A*实现 150
7.4.2 A*实现的笔记 153
7.5 小结 153
第4部分 大规模设计
第8章 宏 157
8.1 数据即代码即数据 158
8.1.1 语法quote、反quote和拼接 159
8.1.2 宏之经验谈 160
8.2 定义控制结构 161
8.2.1 不用语法quote定义控制结构 161
8.2.2 使用语法quote和反quote定义控制结构 162
8.3 组合form的宏 163
8.4 使用宏改变form 165
8.5 使用宏控制符号解析 168
8.5.1 回指 169
8.5.2 (具有争议地)有用的选择性名字捕获 170
8.6 使用宏管理资源 171
8.7 知识汇总:返回函数的宏 172
8.8 小结 175
第9章 组合数据与代码 176
9.1 命名空间 176
9.1.1 创建命名空间 177
9.1.2 只暴露所需 179
9.1.3 声明性包含和排除 181
9.2 以通用设计模式探索Clojure多重方法 182
9.2.1 组成部分 183
9.2.2 用法 184
9.2.3 以多重方法拯救 184
9.2.4 处理继承行为的特别继承 185
9.2.5 解析层次中的冲突 186
9.2.6 真正的最大功率任意分发 187
9.3 类型、协议和记录 188
9.3.1 记录 188
9.3.2 协议 191
9.3.3 用deftype从更原始的基础开始构建 199
9.4 知识汇总:国际象棋移动的流畅构建器 201
9.4.1 Java实现 201
9.4.2 Clojure实现 203
9.5 小结 205
第10章 Java.next 206
10.1 使用proxy动态生成对象 207
10.2 Clojure gen-class和GUI程序设计 211
10.2.1 命名空间作为类的规范 211
10.2.2 以Clojure探索用户界面设计与开发 214
10.3 Clojure同Java数组的关系 217
10.3.1 数组的类型:原生与引用 217
10.3.2 数组可变性 219
10.3.3 那个不幸的命名约定 220
10.3.4 多维数组 221
10.3.5 调用可变方法/构造函数 221
10.4 所有Clojure函数都实现…… 222
10.4.1 java.util.Comparator 222
10.4.2 java.lang.Runnable 223
10.4.3 java.util.concurrent.Callable 223
10.5 在Java API里使用Clojure数据结构 224
10.5.1 java.util.List 224
10.5.2 java.lang.Comparable 225
10.5.3 java.util.RandomAccess 225
10.5.4 java.util.Collection 225
10.5.5 java.util.Set 226
10.6 definterface 227
10.7 慎用异常 229
10.7.1 一点异常的背景 229
10.7.2 运行时异常vs.编译时异常 230
10.7.3 处理异常 231
10.7.4 定制异常 232
10.8 小结 233
^ 收 起
Michael Fogus 是Clojure/core成员,在分布式模拟、机器视觉及专家系统方面拥有丰富的经验。 Chris Houser是Clojure 的关键贡献者,曾实现了几个重要的特性。
Clojure是一门Lisp方言。它通过函数式编程技术,直接支持并发软件开发,得到众多开发人员的欢迎。 《Clojure编程乐趣》并非Clojure初学指南,也不是一本Clojure的编程操作手册,而是通过对Clojure详尽地探究,教授函数式的程序设计方式,帮助读者理解和体会Clojure编程的乐趣,进而开发出优美的软件。 全书分为5个部分共13章。第1部分是基础,包括第1章到第3章,从Clojure背后的思想开始,介绍了Clojure的基础知识,并带领读者初步尝试Clojure编程。第2部分包括第4章和第5章,介绍了Clojure的各种数据类型。第3部分是第6章和第7章,介绍了函数式编程的特性。第4部分包括第8章到第11章,分别介绍了宏、组合数据域代码、Clojure对Java的调用,以及并发编程等较为高级的话题。第5部分为第12章和第13章,探讨了Clojure的性能问题及其带给我们的思考。 《Clojure编程乐趣》适合有一定基础的Clojure程序员阅读,进而掌握函数编程的思考方法和程序设计方法,也可以作为读者学习函数式编程的参考资料。
^ 收 起
^ 收 起
比价列表