第1章 接受现实 1
编程时应该关注数据转换 1
借助管道来组合转换 2
函数是数据转换器 3
安装Elixir 3
运行Elixir 4
iex——交互式Elixir 4
编译和运行 8
对阅读本书的建议 9
练习 9
换一种方式思考 10
第一部分 常规编程 12
第2章 模式匹配 12
赋值:并非如你所料 12
更复杂的匹配 13
轮到你了 15
用_(下画线)忽略匹配值 15
每次匹配变量仅绑定一次 15
轮到你了 17
从另一个角度来看等号 17
第3章 不可变性 18
你已经拥有了(一些)不可变数据 18
不可变的数据才是已知的 19
不可变性对性能的影响 20
复制数据 20
垃圾回收 20
用不可变数据编写程序 21
第4章 Elixir基础 22
内置类型 22
值类型 23
整数 23
浮点数 23
原子 24
区间 24
正则表达式 24
系统类型 25
PID和端口 25
引用 25
收集类型 26
元组 26
列表 27
散列表 28
二进制型 29
命名、源文件、约定、运算符和其他 30
真值 30
运算符 31
小结 32
第5章 匿名函数 33
函数和模式匹配 34
轮到你了 35
一个函数,多个函数体 35
编写更长的代码 36
轮到你了 37
能返回函数的函数 37
记住原始环境的函数 38
参数化函数 39
轮到你了 39
将函数作为参数来传递 40
&运算符 40
轮到你了 42
函数是核心 42
第6章 模块与命名函数 43
编译模块 43
函数体是代码块 44
轮到你了 45
函数调用与模式匹配 45
轮到你了 48
哨兵子句 48
哨兵子句的限制 49
默认参数 50
轮到你了 53
私有函数 53
|>——美妙的管道运算符 54
模块 55
模块指令 57
import指令 57
alias指令 58
require指令 58
模块属性 58
模块名:Elixir、Erlang和原子类型 59
调用Erlang的库函数 60
寻找函数库 60
轮到你了 61
第7章 列表与递归 62
头部和尾部 62
使用头部和尾部来处理列表 63
iex如何显示列表 64
使用头部和尾部来构造列表 66
创建映射函数 67
在递归过程中跟踪值 68
轮到你了 69
生成求和函数 69
轮到你了 70
更复杂的列表模式 71
列表的列表 71
轮到你了 74
List模块实战 75
与列表友好相处 76
第8章 字典:散列表、散列字典、关键字列表、集合与结构体 77
如何在散列表、散列字典和关键字列表之间做选择 77
字典 78
模式匹配和更新散列表 79
模式匹配不能绑定键 81
更新散列表 82
散列表与结构体 82
访问结构体的另一种方式 84
嵌套字典结构 85
嵌套访问器和非结构体 86
动态(运行时)嵌套访问器 87
集合 88
能力越大,诱惑越大 89
第9章 番外篇——类型是什么 90
第10章 处理收集——Enum与Stream 92
Enum——处理收集 92
关于排序的说明 95
轮到你了 96
Stream——延迟处理的枚举类型 96
流是可组合的枚举器 97
无限流 99
自定义流 99
流在实际中的应用 104
Collectable协议 104
推导式 105
推导式也可以处理二进制位 106
作用域与推导式 107
推导式的返回值 107
轮到你了 108
感动过往的神 109
第11章 字符串与二进制型 110
字符串字面量 110
Heredoc 111
魔术符 112
“字符串”这个名称 113
单引号字符串——字符编码列表 114
轮到你了 116
二进制型 117
双引号字符串是二进制型 118
字符串与Elixir库 118
轮到你了 124
二进制型与模式匹配 124
用二进制型来处理字符串 124
轮到你了 125
熟悉却又陌生 126
第12章 控制流 127
if与unless 127
cond 128
case 131
抛出异常 133
包含异常的设计 133
四两拨千斤 134
轮到你了 134
第13章 组织项目 136
项目:从GitHub获取issue 136
我们的代码将如何工作 137
任务:用mix来创建我们的新项目 137
创建项目树 138
转换:解析命令行 140
进阶:编写一些基本的测试 142
轮到你了 144
转换:从GitHub获取数据 144
任务:使用外部库 145
寻找库 146
为项目添加库 146
轮到你了 148
回到转换 148
转换:转换响应内容 151
不在hex里的依赖项 152
应用程序配置 152
转换:为数据排序 153
转换:取前n条 155
轮到你了 156
转换:格式化表格 156
任务:创建命令行可执行程序 159
任务:添加日志 161
任务:测试代码注释 163
任务:创建项目文档 167
使用转换数据的方法来编写代码 169
轮到你了 170
第二部分 并发编程 172
第14章 运用多进程 172
简单的进程 173
在进程间发送消息 174
处理多条消息 175
递归、循环与栈 178
进程开销 178
轮到你了 181
进程何时结束 182
关联两个进程 183
监控进程 185
轮到你了 186
并行map——Erlang版本的“Hello,World” 186
轮到你了 187
斐波那契数服务器 188
任务调度器 189
轮到你了 192
代理——一个难题 192
以进程的方式来思考 194
第15章 节点——分布式服务的关键 195
命名节点 195
轮到你了 197
节点、cookie与安全 198
给你的进程命名 199
何时给进程命名 202
轮到你了 202
I/O、PID与节点 203
轮到你了 204
节点是分布式的基础 205
第16章 OTP:服务器 206
一些OTP的定义 206
OTP服务器 207
状态和单个服务器 207
我们的第一个OTP服务器 208
轮到你了 210
单向调用 210
跟踪服务器的执行情况 212
轮到你了 214
GenServer回调函数 214
给进程命名 216
整理接口 217
轮到你了 218
第17章 OTP:应用程序监视器 220
应用程序监视器与工作进程 220
轮到你了 223
管理重启前后的进程状态 223
应用程序监视器是可靠性的核心 229
轮到你了 229
第18章 OTP:应用程序 230
这不是传统的应用程序 230
应用程序规范文件 231
将Sequence程序转变为OTP应用程序 231
关于应用参数的更多信息 234
监视是可靠性的基础 234
轮到你了 235
热代码交换 235
OTP很大——难以置信的大 241
轮到你了 241
第19章 任务与代理 242
任务 242
任务与监视 243
代理 244
更大的例子 246
使其分布式运行 248
使用代理与任务,还是GenServer 249
第三部分 更高级的Elixir 252
第20章 宏与代码求值 252
实现if语句 252
宏注入代码 254
装载次序 255
quote函数 256
将内部表示作为代码使用 256
unquote函数 258
展开列表——unquote_splicing 259
回到我们的myif宏 260
轮到你了 261
使用绑定来注入值 261
宏是卫生的 263
执行代码片段的其他方法 264
宏与运算符 265
深入研究 266
更进一步 266
轮到你了 267
第21章 连接多个模块:行为与use 268
行为 268
定义行为 268
声明行为 269
use与_using_ 270
放到一起——跟踪方法调用 270
使用use 275
轮到你了 275
第22章 协议——多态函数 277
定义协议 277
实现协议 278
可用的类型 279
轮到你了 280
协议和结构体 280
内置协议:Access 281
内置协议:Enumerable 282
内置协议:String.Chars 285
内置协议:Inspect 286
协议就是多态 288
轮到你了 288
第23章 更酷的玩意儿 290
自定义魔术符 290
获取选项 292
轮到你了 293
多应用的umbrella项目 294
创建umbrella项目 295
创建子项目 295
LineSigil项目 296
Evaluator项目 296
连接子项目 297
别急!还有更多炫酷的玩意儿! 299
附录A 异常:raise与try,catch与throw 300
附录B 类型规范与类型检查 306