第1部分 语言基础 1
1 Lua语言入门 2
1.1 程序段 3
1.2 一些词法规范 5
1.3 全局变量 7
1.4 类型和值 7
1.4.1 nil 8
1.4.2 Boolean 8
1.5 独立解释器 10
1.6 练习 12
2 小插曲:八皇后问题 13
2.1 练习 15
3 数值 17
3.1 数值常量 17
3.2 算术运算 19
3.3 关系运算 21
3.4 数学库 21
3.4.1 随机数发生器 22
3.4.2 取整函数 22
3.5 表示范围 24
3.6 惯例 25
3.7 运算符优先级 26
3.8 兼容性 27
3.9 练习 28
4 字符串 30
4.1 字符串常量 31
4.2 长字符串/多行字符串 33
4.3 强制类型转换 34
4.4 字符串标准库 36
4.5 Unicode编码 39
4.6 练习 41
5 表 43
5.1 表索引 44
5.2 表构造器 46
5.3 数组、列表和序列 48
5.4 遍历表 50
5.5 安全访问 52
5.6 表标准库 53
5.7 练习 54
6 函数 56
6.1 多返回值 58
6.2 可变长参数函数 61
6.3 函数table.unpack 64
6.4 正确的尾调用 65
6.5 练习 66
7 输入输出 68
7.1 简单I/O模型 68
7.2 完整I/O模型 72
7.3 其他文件操作 74
7.4 其他系统调用 75
7.4.1 运行系统命令 75
7.5 练习 77
8 补充知识 78
8.1 局部变量和代码块 78
8.2 控制结构 80
8.2.1 ifthen else 81
8.2.2 while 81
8.2.3 repeat 82
8.2.4 数值型for 82
8.2.5 泛型for 83
8.3 break、return和goto 84
8.4 练习 88
第2部分 编程实操 91
9 闭包 92
9.1 函数是第一类值 93
9.2 非全局函数 95
9.3 词法定界 97
9.4 小试函数式编程 101
9.5 练习 104
10 模式匹配 106
10.1 模式匹配的相关函数 106
10.1.1 函数string.find 106
10.1.2 函数string.match 107
10.1.3 函数string.gsub 108
10.1.4 函数string.gmatch 108
10.2 模式 109
10.3 捕获 113
10.4 替换 115
10.4.1 URL编码 117
10.4.2 制表符展开 119
10.5 诀窍 120
10.6 练习 124
11 小插曲:出现频率最高的单词 125
11.1 练习 127
12 日期和时间 129
12.1 函数os.time 130
12.2 函数os.date 131
12.3 日期和时间处理 133
12.4 练习 135
13 位和字节 136
13.1 位运算 136
13.2 无符号整型数 137
13.3 打包和解包二进制数据 140
13.4 二进制文件 143
13.5 练习 145
14 数据结构 146
14.1 数组 147
14.2 矩阵及多维数组 147
14.3 链表 150
14.4 队列及双端队列 151
14.5 反向表 152
14.6 集合与包 153
14.7 字符串缓冲区 155
14.8 图形 157
14.9 练习 159
15 数据文件和序列化 160
15.1 数据文件 161
15.2 序列化 163
15.2.1 保存不带循环的表 166
15.2.2 保存带有循环的表 168
15.3 练习 170
16 编译、执行和错误 172
16.1 编译 172
16.2 预编译的代码 176
16.3 错误 178
16.4 错误处理和异常 180
16.5 错误信息和栈回溯 181
16.6 练习 183
17 模块和包 185
17.1 函数require 186
17.1.1 模块重命名 188
17.1.2 搜索路径 189
17.1.3 搜索器 191
17.2 Lua语言中编写模块的基本方法 191
17.3 子模块和包 194
17.4 练习 195
第3部分 语言特性 197
18 迭代器和泛型for 198
18.1 迭代器和闭包 198
18.2 泛型for的语法 201
18.3 无状态迭代器 202
18.4 按顺序遍历表 204
18.5 迭代器的真实含义 206
18.6 练习 207
19 小插曲:马尔可夫链算法 209
19.1 练习 212
20 元表和元方法 213
20.1 算术运算相关的元方法 214
20.2 关系运算相关的元方法 217
20.3 库定义相关的元方法 218
20.4 表相关的元方法 220
20.4.1 __index元方法 220
20.4.2 __newindex元方法 221
20.4.3 具有默认值的表 222
20.4.4 跟踪对表的访问 223
20.4.5 只读的表 225
20.5 练习 226
21 面向对象(Object-Oriented)编程 227
21.1 类(Class) 229
21.2 继承(Inheritance) 231
21.3 多重继承(MultipleInheritance) 233
21.4 私有性(Privacy) 236
21.5 单方法对象(Single-method Object) 238
21.6 对偶表示(Dual Representation) 239
21.7 练习 241
22 环境(Environment) 242
22.1 具有动态名称的全局变量 243
22.2 全局变量的声明 244
22.3 非全局环境 247
22.4 使用_ENV 249
22.5 环境和模块 252
22.6 _ENV和load 253
22.7 练习 255
23 垃圾收集 256
23.1 弱引用表 256
23.2 记忆函数(Memorize Function) 258
23.3 对象属性(Object Attribute) 260
23.4 回顾具有默认值的表 261
23.5 瞬表(Ephemeron Table) 262
23.6 析构器(Finalizer) 263
23.7 垃圾收集器 267
23.8 控制垃圾收集的步长(Pace) 268
23.9 练习 269
24 协程(Coroutine) 271
24.1 协程基础 271
24.2 哪个协程占据主循环 274
24.3 将协程用作迭代器 277
24.4 事件驱动式编程 280
24.5 练习 285
25 反射(Reflection) 286
25.1 自省机制(Introspective Facility) 287
25.1.1 访问局部变量 289
25.1.2 访问非局部变量 290
25.1.3 访问其他协程 292
25.2 钩子(Hook) 293
25.3 调优(Profile) 294
25.4 沙盒(Sandbox) 297
25.5 练习 301
26 小插曲:使用协程实现多线程 302
26.1 练习 307
第4部分 C语言API 309
27 C语言API总览 310
27.1 第一个示例 311
27.2 栈 314
27.2.1 压入元素 315
27.2.2 查询元素 316
27.2.3 其他栈操作 319
27.3 使用C API进行错误处理 322
27.3.1 处理应用代码中的错误 322
27.3.2 处理库代码中的错误 323
27.4 内存分配 324
27.5 练习 326
28 扩展应用 327
28.1 基础知识 327
28.2 操作表 329
28.2.1 一些简便方法 333
28.3 调用Lua函数 335
28.4 一个通用的调用函数 336
28.5 练习 340
29 在Lua中调用C语言 341
29.1 C函数 341
29.2 延续(Continuation) 344
29.3 C模块 347
29.4 练习 349
30 编写C函数的技巧 351
30.1 数组操作 351
30.2 字符串操作 353
30.3 在C函数中保存状态 357
30.3.1 注册表 357
30.3.2 上值 360
30.3.3 共享的上值(Shared upvalue) 363
30.4 练习 364
31 C语言中的用户自定义类型 365
31.1 用户数据(Userdata) 366
31.2 元表(Metatable) 369
31.3 面向对象访问 372
31.4 数组访问 374
31.5 轻量级用户数据 376
31.6 练习 377
32 管理资源 378
32.1 目录迭代器 378
32.2 XML解析器 382
32.3 练习 392
33 线程和状态 394
33.1 多线程 394
33.2 Lua状态 399
33.3 练习 408