前言 1
第一部分 语言概念 11
第1章 导览旅行 11
1.1 OCaml作为计算器 11
1.2 函数和类型推断 13
1.3 元组、列表、选项和模式匹配 17
1.4 记录和变体 25
1.5 命令式编程 27
1.6 一个完整的程序 32
1.7 下一章的内容 33
第2章 变量和函数 34
2.1 变量 34
2.2 函数 38
第3章 列表和模式 55
3.1 列表基础 55
3.2 使用模式从列表抽取数据 56
3.3 模式匹配的局限性(和好处) 58
3.4 有效地使用List模块 61
3.5 尾递归 67
3.6 更简洁更快速的模式 69
第4章 文件、模块和程序 73
4.1 单文件程序 73
4.2 多文件程序和模块 76
4.3 签名和抽象类型 77
4.4 签名中的具体类型 80
4.5 嵌套模块 81
4.6 打开模块 82
4.7 包含模块 84
4.8 模块的常见错误 86
4.9 基于模块的设计 88
第5章 记录 91
5.1 模式和完备性 93
5.2 字段双关 95
5.3 重用字段名 96
5.4 功能更新 99
5.5 可变字段 101
5.6 首类字段 102
第6章 变体 106
6.1 Catch-All情况和重构 108
6.2 结合记录和变体 110
6.3 变体和递归数据结构 114
6.4 多态变体 117
第7章 错误处理 125
7.1 错误感知返回类型 125
7.2 异常 130
7.3 选择错误处理策略 139
第8章 命令式编程 141
8.1 示例:命令式字典 141
8.2 基本可变数据 145
8.3 for和while循环 148
8.4 示例:双向链表 149
8.5 懒惰和其他良性影响 153
8.6 输入和输出 160
8.7 计算顺序 166
8.8 副作用和弱多态 168
8.9 小结 173
第9章 仿函数 175
9.1 一个简单例子 176
9.2 一个更大的例子:间隔计算 177
9.3 扩展模块 189
第10章 首类模块 193
10.1 使用首类模块 193
10.2 示例:队列处理框架 199
10.3 如果没有首类模块 208
第11章 对象 210
11.1 OCaml对象 211
11.2 对象多态 212
11.3 不可变对象 214
11.4 如何使用对象 215
11.5 子类型化 216
第12章 类 225
12.1 OCaml类 225
12.2 类参数和多态 226
12.3 对象类型作为接口 228
12.4 继承 231
12.5 类类型 232
12.6 开放递归 233
12.7 私有方法 235
12.8 二值化方法 236
12.9 虚类和方法 239
12.10 初始化方法 242
12.11 多重继承 243
第二部分 工具和技术 251
第13章 映射和散列表 251
13.1 映射 252
13.2 散列表 261
13.3 映射和散列表之间的选择 264
第14章 命令行解析 268
14.1 基本命令行解析 269
14.2 参数类型 272
14.3 为命令行增加标签标志 277
14.4 组合子命令 278
14.5 对解析的高级控制 281
14.6 使用bash实现命令行自动完成 286
14.7 其他命令行解析器 288
第15章 处理JSON数据 289
15.1 JSON基础 289
15.2 用Yojson解析JSON 290
15.3 从JSON结构选择值 292
15.4 构造JSON值 296
15.5 使用非标准JSON扩展 298
15.6 JSON自动映射到OCaml类型 299
第16章 用OCamllex和Menhir完成解析 306
16.1 词法分析和解析 307
16.2 定义解析器 309
16.3 定义词法分析器 312
16.4 集成 316
第17章 利用S-表达式实现数据串行化 319
17.1 基本用法 320
17.2 Sexp格式 323
17.3 保持不变式 324
17.4 得到合适的错误消息 327
17.5 S-表达式转换指令 329
第18章 利用Async实现并发编程 334
18.1 Async基础 335
18.2 示例:回显服务器 340
18.3 示例:用DuckDuckGo搜索定义 345
18.4 异常处理 349
18.5 超时、撤销和选择 356
18.6 处理系统线程 358
第三部分 运行时系统 365
第19章 外部函数接口 365
19.1 示例:终端界面 366
19.2 基本标量C类型 370
19.3 指针和数组 371
19.4 结构和联合 374
19.5 向C传递函数 380
19.6 关于C绑定 383
第20章 值的内存表示 385
20.1 OCaml块和值 386
20.2 块和值 387
20.3 元组、记录和数组 389
20.4 变体和列表 390
20.5 多态变体 392
20.6 字符串值 392
20.7 定制堆块 393
第21章 了解垃圾回收器 395
21.1 标记和清扫垃圾回收 395
21.2 世代垃圾回收 396
21.3 快速次堆 396
21.4 长生存期的主堆 398
21.5 为值关联最终化函数 405
第22章 编译器前端:解析和类型检查 407
22.1 工具链概览 407
22.2 解析源代码 410
22.3 预处理源代码 414
22.4 静态类型检查 419
22.5 类型化语法树 431
第23章 编译器后端:字节码和原生代码 435
23.1 无类型Lambda形式 435
23.2 生成可移植的字节码 439
23.3 编译快速原生代码 444
23.4 文件扩展名小结 453