Erlang趣学指南
Erlang趣学指南
对本书的赞誉
致不了解Erlang的读者
致Erlang熟手
致已经阅读过在线内容的读者
引言
Erlang是什么
保持冷静
准备工作
从哪里寻求帮助
1 启程
1.1 使用Erlang shell
1.1.1 输入shell命令
1.1.2 退出shell
1.2 Erlang基础知识
1.2.1 数值类型
1.2.2 不变的变量
1.2.3 原子
1.2.4 布尔代数和比较操作符
1.2.5 元组
1.2.6 列表
1.2.7 列表推导式
1.3 处理二进制数据
1.3.1 位语法
1.3.2 二进制数的按位操作
1.3.3 二进制字符串
1.3.4 二进制推导式
2 模块
2.1 什么是模块
2.2 创建模块
2.3 编译代码
编译选项
2.4 定义宏
2.5 模块的其他内容
2.5.1 元数据
2.5.2 环形依赖
3 函数
3.1 模式匹配
3.1.1 模式进阶
3.1.2 绑定中的变量
3.2 卫语句
3.3 if表达式
3.4 case ... of表达式
3.5 如何选择
4 类型
4.1 动态强类型
4.2 类型转换
4.3 数据类型检测函数
4.4 致静态类型爱好者
5 递归
5.1 递归的工作原理
5.1.1 列表的长度
5.1.2 列表长度的尾递归实现
5.2 更多递归函数
5.2.1 duplicate函数
5.2.2 reverse函数
5.2.3 sublist函数
5.2.4 zip函数
5.2.5 快速排序
5.3 不仅仅是列表
5.4 递归思维
6 高阶函数
6.1 一切都是函数
6.2 匿名函数
6.2.1 匿名函数的其他用途
6.2.2 函数的作用域和闭包
6.3 映射、过滤器、折叠以及其他
6.3.1 过滤器
6.3.2 折叠一切
6.3.3 其他抽象
7 错误和异常
7.1 错误编译
7.1.1 编译期错误
7.1.2 逻辑错误
7.1.3 运行时错误
7.2 引发异常
7.2.1 出错异常
7.2.2 退出异常
7.2.3 抛出异常
7.3 处理异常
7.3.1 处理不同类型的异常
7.3.2 catch后的after语句
7.3.3 尝试多个表达式
7.3.4 更多选择
7.4 在树中使用try语句
8 用函数式思维解决问题
8.1 逆波兰式计算器
8.1.1 RPN计算器的工作原理
8.1.2 实现RPN计算器
8.1.3 代码测试
8.2 从希思罗到伦敦
8.2.1 递归地解决问题
8.2.2 编写代码
8.2.3 不使用Erlang shell运行程序
9 常用数据结构简介
9.1 记录
9.1.1 定义记录
9.1.2 读取记录字段值
9.1.3 更新记录
9.1.4 共享记录定义
9.2 键/值存储
9.2.1 小数据量存储
9.2.2 大数据量存储:字典和通用平衡树
9.3 集合
9.4 有向图
9.5 队列
9.6 小结
10 并发编程漫游指南
10.1 不必惊慌
10.2 并发概念
10.2.1 伸缩性
10.2.2 容错
10.2.3 并发实现
10.3 并非完全不能线性伸缩
10.4 再见,谢谢你的鱼
10.4.1 创建进程
10.4.2 发送消息
10.4.3 接收消息
11 深入多重处理
11.1 定义进程状态
11.2 隐藏消息实现
11.3 超时
11.4 选择性接收
11.4.1 选择性接收的风险
11.4.2 邮箱使用的其他风险
12 错误与进程
12.1 链接
12.1.1 捕获退出信号
12.1.2 老异常,新概念
12.2 监控器
12.3 命名进程
13 并发应用设计
13.1 理解问题
13.2 设计协议
13.3 目录结构
13.4 事件模块
13.4.1 事件和循环
13.4.2 增加接口
13.5 事件服务器
13.5.1 处理消息
13.5.2 代码热升级
13.5.3 隐藏消息细节
13.6 测试
13.7 增加监督功能
13.8 命名空间
14 OTP简介
14.1 提炼通用进程
14.2 基础服务器
14.2.1 kitty服务器
14.2.2 通用化同步调用
14.2.3 通用化服务器循环
14.2.4 启动函数
14.2.5 通用化kitty服务器
14.3 专用与通用
14.4 面向未来的回调
14.4.1 init函数
14.4.2 handle_call函数
14.4.3 handle_cast函数
14.4.4 handle_info函数
14.4.5 terminate函数
14.4.6 code_change函数
14.5 gen_server实践
15 令人愤怒的有限状态机
15.1 什么是有限状态机
15.2 通用有限状态机
15.2.1 init函数
15.2.2 StateName函数
15.2.3 handle_event函数
15.2.4 handle_syn_event函数
15.2.5 code_change和terminate函数
15.3 交易系统规格说明
15.3.1 操作定义
15.3.2 定义状态图和状态迁移
15.4 游戏交易
15.4.1 公共接口
15.4.2 FSM到FSM的函数
15.4.3 gen_fsm回调函数
15.5 为自己骄傲
15.6 适用于真实世界吗
16 事件处理器
16.1 处理它!泵式散弹枪
16.2 通用事件处理器
16.2.1 init和terminate函数
16.2.2 handle_event函数
16.2.3 handle_call函数
16.2.4 handle_info函数
16.2.5 code_change函数
16.3 现在是冰壶比赛时间
16.3.1 记分牌
16.3.2 比赛事件
16.3.3 通知新闻界
17 谁来监督监督者
17.1 监督者中的概念
17.2 使用监督者
17.2.1 重启策略
17.2.2 重启限制
17.2.3 子进程规格说明
17.3 乐队排练
17.3.1 音乐人
17.3.2 乐队监督者
17.4 动态监督
17.4.1 动态使用标准监督者
17.4.2 使用simple_one_for_one监督者
18 构建应用
18.1 进程池
18.1.1 洋葱理论
18.1.2 进程池监督树
18.2 实现监督者
18.3 进程池服务器
18.4 实现工作者
18.5 运行进程池
18.6 小结
19 构建OTP应用
19.1 我还有辆车是一个游泳池
19.2 应用资源文件
19.3 把ppool转换成OTP应用
19.4 application行为
19.5 从混乱到应用
19.6 库应用
20 深入OTP应用
20.1 从OTP应用到真实的应用
20.1.1 应用文件
20.1.2 应用回调模块和监督者
20.1.3 分派器
20.1.4 计数模块
20.2 运行应用
20.3 包含应用
20.4 复杂的终止
21 发布
21.1 修理漏水的管道
21.1.1 终止VM
21.1.2 更新应用文件
21.1.3 编译应用
21.2 使用systools构建发布
21.2.1 创建启动文件
21.2.2 发布打包
21.3 使用Reltool构建发布
Reltool选项
21.4 Reltool技巧集
21.5 基于release文件发布
22 升级Process Quest
22.1 升级面临的问题
22.2 Erlang学习的第9级
22.3 Process Quest
22.3.1 regis-1.0.0应用
22.3.2 processquest-1.0.0 应用
22.3.3 sockserv-1.0.0应用
22.3.4 发布
22.4 改进Process Quest
22.4.1 更改code_change函数
22.4.2 增加appup文件
22.4.3 发布升级
22.5 Relup回顾
23 套接字编程
23.1 IO列表
23.2 UDP和TCP:伙伴协议
23.2.1 UDP套接字
23.2.2 TCP套接字
23.3 使用Inet进行更多的控制
23.4 重新审视sockserv
23.5 下一步的工作
24 EUnit:单元测试框架
24.1 什么是EUnit
24.2 测试生成器
24.3 测试夹具
24.3.1 其他测试控制方法
24.3.2 测试文档
24.4 测试regis
24.5 EUnit小结
25 ETS:免费的内存NoSQL数据库
25.1 为什么需要ETS
25.2 ETS的概念
25.3 ETS的基本操作
25.3.1 表的创建和删除
25.3.2 数据的插入和查询
25.4 匹配操作
25.5 选择操作
25.6 DETS
25.7 少说一点,多做一点
25.7.1 接口
25.7.2 实现细节
26 分布式编程
26.1 这是我的火枪
26.2 分布式计算中的谬误
26.2.1 网络是可靠的
26.2.2 网络没有延迟
26.2.3 带宽是无限的
26.2.4 网络是安全的
26.2.5 网络拓扑不会变化
26.2.6 只有一个管理员
26.2.7 传输成本是零
26.2.8 网络是同质的
26.2.9 谬误小结
26.3 死亡还是失去联系
26.4 CAP定理
26.4.1 一致性
26.4.2 可用性
26.4.3 分区容忍
26.4.4 僵尸幸存者和CAP
26.5 搭建Erlang集群
26.5.1 节点命名
26.5.2 连接节点
26.5.3 更多工具
26.6 cookie
26.7 远程shell
26.8 隐藏节点
26.9 防火墙问题
26.10 高级调用
26.10.1 net_kernel模块
26.10.2 global模块
26.10.3 rpc模块
26.11 小结
27 分布式OTP应用
27.1 更多OTP内容
27.2 接管和故障切换
27.3 神奇8号球
27.3.1 构建应用
27.3.2 变身分布式应用
28 不寻常的Common Test
28.1 什么是Common Test
28.2 Common Test的组织结构
28.3 创建一个简单的测试套件
运行测试
28.4 带状态的测试
28.5 测试组
28.5.1 定义测试组
28.5.2 测试组属性
28.5.3 会议室
28.6 再谈测试套件
28.7 测试规格说明
28.7.1 规格说明文件内容
28.7.2 创建规格说明文件
28.7.3 通过规格说明文件运行测试
28.8 大规模测试
28.8.1 创建分布式测试规格说明文件
28.8.2 运行分布式测试
28.9 集成Common Test和EUint
28.10 还有其他内容吗
29 Mnesia——记忆的艺术
29.1 Mnesia是什么
29.2 应该存储什么呢
29.2.1 需要存储的数据
29.2.2 表结构
29.3 从记录到表
29.4 Mnesia数据模式和表
29.5 创建表
29.5.1 安装数据库
29.5.2 启动应用
29.6 数据表存取上下文
29.7 读、写以及其他操作
29.8 实现第一个请求
29.8.1 测试增加服务
29.8.2 测试查询
29.8.3 账目和新的需求
29.9 满足老板
29.10 删除操作示例
29.11 列表推导式查询
29.12 记住Mnesia
30 类型规格说明与Dialyzer
30.1 PLT是最好的三明治
30.2 成功类型化
30.3 类型推导和错误
30.4 类型的种类
30.4.1 单例类型
30.4.2 联合类型和内置类型
30.4.3 定义类型
30.4.4 记录类型
30.5 为函数增加类型声明
30.6 类型定义实践
30.7 类型导出
30.8 OTP行为类型
30.9 多态类型
30.9.1 我们买了一个动物园
30.9.2 注意事项
30.10 Dialyzer,我的好朋友
30.11 朋友们,就这么多
其他Erlang应用
社区贡献的库
你的想法非常吸引我,我想订阅你的最新文章
本书结束了吗
附录 Erlang语法
A.1 模板
A.2 英语句子
A.3 与、或、完成
A.4 结论
思维导图
防止博客图床图片失效,防止图片源站外链:
http://www.processon.com/chart_image/5e5b3771e4b069f82a1a5e73.png)
思维导图在线编辑链接: