Lua程序设计(第4版)
  • 推荐2
  • 收藏9
  • 浏览3.6K

Lua程序设计(第4版)

Roberto Ierusalimschy (作者)  梅隆魁 (译者)

  • 书  号:978-7-121-33804-5
  • 出版日期:2018-06-28
  • 页  数:432
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: programming in lua forth edition
  • 原书号:9788590379867
  • 维护人:符隆美
纸质版 ¥89.00
本书由 Lua 语言作者亲自撰写,针对 Lua 语言本身由浅入深地从各个方面进行了完整和细致的讲解。作为第 4 版,本书主要针对的是 Lua 5.3,这是本书撰写时 Lua 语言的最新版本。作者从语言使用者的角度出发,讲解了语言基础、编程实操、高级特性及 C 语言 API 等四个方面的内容,既有 Lua 语言基本数据类型、输入输出、控制结构等基础知识,也有对模块、闭包、元表、协程、延续、反射、环境、垃圾回收、函数式编程、面向对象编程、C 语言 API 等高级特性的系统讲解,还有对 Lua 5.3 中引入的整型、位运算、瞬表、延续等新功能的细致说明。
Lua作为精简的嵌入式语言,适合与C/C++相互调用,在游戏开发、数据库插件、安全系统中均有广泛的应用。
推荐序一
Lua 这种类似于“胶水”的语言在游戏行业被广泛应用。我已经在游戏行业摸爬滚打了 很多年,对游戏行业的变化之快深有体会:游戏策划时常更改设计是行业特点,工程师必须 把“不要写死,要能热更”这句话刻在心里。因此在做开发时,大家喜欢把逻辑放在 Lua 这 种嵌入型语言中,一方面是因为 Lua 性能好,另一方面主流引擎都支持通过推送 Lua 脚本来 实现热更新,这样在修改 Bug 或者更新内容时,用户就不需要重新下载整个游戏安装包。并 且 Lua 上手难度不高,所以很多初入游戏行业的程序员往往先学 Lua。但是,Lua 的中文学 习资料很有限,社区上的知识比较零碎,为数不多的英文书翻译本也质量平平或其中所讲的 版本已经过时,增加了初学者系统学习 Lua 的难度。所以,现在我们手中的这本用心打磨的 译本,无疑是初学者的福音。 翻译一本有用的但不蹭热点的书,就像我们开发一款源自内心的喜爱却不跟风的游戏, 也许不会成为爆款,但是总会对得起自己,也总能收获一群用户的喜爱。这本《Lua 程序设 计(第 4 版)》,体现了译者的“傻劲”——不追捧热点、专注自己想做的事情。这种“傻劲” 是这个时代稀缺的。然而读者也好,游戏用户也好,往往就喜欢这种“傻人”和他们的“傻 劲”,我真心希望这样的“傻人”“傻劲”能多一些。 译者还计划要做一个 Lua 的社区,欢迎大家关注,也欢迎推荐给身边的朋友,独乐乐不 如众乐乐。最后,开卷有益,祝大家学习愉快。
焦洋 盖娅互娱 CTO

推荐序二
这几年来,由于阅读 Lua 虚拟机实现源码的缘故,我深入了解了 Lua 的很多内部实现原 理。Lua 作为一门诞生已经超过 20 年的语言,在设计上是非常克制的,以 Lua 5.1.4 版本来 说,这个版本是 Lua 发展了十几年之后稳定使用了很长时间的版本,其解释器加上周边的库 函数等不过就是一万多行的代码。 在设计上,Lua 语言从一开始就把简单、高效、可移植、可嵌入、可扩展等作为自己的 目标。打一个可能不是太恰当的比方,Lua 语言专注于做一个配角,作为胶水语言来辅助像 C、C++ 这样的主角来更好地完成工作,当其他语言在前面攻城拔寨时,Lua 语言在后方实 现自己辅助的作用。现在大部分主流编程语言都在走大而全的路线,在号称学会某一门语言 就能成为所谓的“全栈工程师”的年代,Lua 语言始终恪守本分地做好“胶水语言”的本职 工作,不得不说是一个异类的存在。 “上善若水,水善利万物而不争”,这大概是我能想到的最适合用于来描述 Lua 语言设计 哲学的句子。 然而,我发现想找到一本关于 Lua 语言本身设计相关的书籍却很难。打开任何一个电商 网站,以关键字“Lua”来进行搜索,能找到的相关书籍大多是如何基于 Lua 做应用开发,如 游戏、OpenResty 等。在 2008 年,国内曾引进并翻译了《Lua 程序设计(第 2 版)》。然而, 这一本书已经绝版不再印刷,而且 Lua 在这些年里也发生了不少的变化,从当时的 5.1 版本 到了现在的 5.3 版本,也在更多领域有了广泛的应用。此时,引进并且翻译最新版本的《Lua 程序设计(第 4 版)》就显得很有必要了。 推荐那些常年要与 Lua 打交道的应用开发者都读一下这本由 Lua 创作者亲自编写的 《Lua 程序设计(第 4 版)》,系统了解一下这门精致的语言,这不但对于深入理解并且使用 好 Lua 有帮助,同时其设计哲学和思想也能在某种程度上开阔我们的视野。
Codedump 《Lua 设计与实现》作者

译者序
2016 年 2 月,时年 27 岁的我因春节期间暴饮暴食导致急性胰腺炎入院治疗两个余月。 当真正别无选择地终日躺在病床上时,就似乎不可避免地开始面对和尝试回答那个亘古不变 的问题:“假设有一天我死了,究竟能够留下什么?” Lua 语言从 1993 年诞生至今已 20 余年,是开源嵌入式脚本语言领域中一门独树一帜 的语言,在包括嵌入式、物联网、游戏、游戏外挂、软件安全、逆向工程等领域中均具有 不可替代的重要地位和极为广泛的应用。截至 2017 年 7 月,Lua 语言在 IEEE Spectrum 编 程语言排行榜中名列第 21 位(http://spectrum.ieee.org/static/interactive-the-topprogramming-languages-2017),在 TIOBE 排行榜中名列第 27 位(The TIOBE Programming Community index,https://www.tiobe.com/tiobe-index)。近年来,除了游戏领域典型的应 用外,包括 Redis、Nginx/OpenResty、NMAP、WOW、OpenWRT、PhotoShop 等大量的著名 产品也均使用 Lua 作为其嵌入式脚本引擎,以供开发者进行功能扩展和二次开发等。伴随着 移动互联网、DevOps 等的迅猛发展,Lua 语言在包括热更新、不停机部署等的实现方面也提 供了一种现实的解决方案(例如银行等金融应用中某些采用 C 语言编写的性能密集型核心 交易逻辑)。在 Lua 语言多年的发展过程中,也有大量的第三方机构对 Lua 语言进行了多方 面的改进和增强,诸如 Lua JIT 等的发展也十分迅速。 除了语言本身的使用外,从语言的实现、原理、设计哲学等角度看,Lua 语言也是学习 编译原理、虚拟机、脚本引擎等的重要参考和现实依据,可以成为相关领域教科书式的典范, 在国外也一直是部分高校计算机专业开展相关课程时的重要学习对象之一。在游戏领域,深 入学习 Lua 语言后进行消化、吸收、优化、重构、增强甚至基于 Lua 语言的思想重新开发一 种脚本语言或一个脚本引擎的例子屡见不鲜;在软件安全领域,基于虚拟机的思想设计出的 各类混淆、VM 保护产品更是有无数的先例;在各种灰色产业中,Lua 语言也同样扮演了更 加鲜为人知的重要角色。 我在研究生期间学习嵌入式和游戏逆向领域的过程中涉猎了 Lua 语言,之后由于在工作 中需要编写 Nginx 和 Redis 的 Lua 脚本(Redis 的 Lua 脚本在原子性、执行效率等方面具有 显著优势)才开始对 Lua 语言进行深入的学习。然而,在学习 Lua 语言的过程中,我发现国内对 Lua 语言的应用仍主要集中在传统的游戏领域,市面上有限的几本在售书籍也主要针对 Lua 语言在游戏开发中的使用,并没有一本书从语言本身的维度进行系统性介绍。目前网络 上的各类中文资料、教程、手册也大多是碎片化的,而且面向的还主要是 Lua 语言的陈旧版 本。对于有一定专业素养的从业人员而言,通常可以通过文档或速成式的教程在数天或数周 内基本掌握一门语言,对于非计算机专业的开发人员或一般使用者则会难些。但我认为即便 只考虑专业从业者,也需要一本权威、系统且工具性的书籍对 Lua 语言进行全面的介绍,以 帮助实现低成本地快速学习和快速上手。此外,从事游戏逆向等软件安全领域的人士也有快 速建立对 Lua 语言认知甚至进行深入学习的必要。 2006 年左右,本书的英文第 2 版出版后,国内出版了其中文译本,但至今已经超过 10 年,且本书的英文第 3 版也已经对全书的内容进行了重大重构,最新的 Lua 5.3 也发生了较 大的变化,因此之前的中文第 2 版和网络上流传的影印版 PDF 均已经不能满足读者现有的 需求。在这样的情况下,加上机缘的巧合,我于 2016 年 11 月开始与电子工业出版社博文视 点的符隆美编辑一起联系了远在巴西的 Lua 语言的作者,并最终从国内诸多出版商和译者中 杀出重围,艰难地争取到了作者的翻译版授权。 目前 Lua 语言在国内的发展不像 Python 语言、R 语言等为人熟知,也不似 Go 语言等站 在风口浪尖,但 Lua 语言在国外却一直保持着持续性的演进,在过去 20 年间表现出了极为 强大的生命力(随便举一个嵌入式领域 OpenWrt 路由器操作系统的例子,目前在各大主流 路由器品牌或 KOS/小博无线等商业 WIFI 服务商中均扮演着不可替代的重要作用)。我相信, 尽管略显小众,译文中也难免有值得商榷之处,这样一本针对 Lua 语言最新版本的权威、系 统性的中文译本都应该能够为游戏、嵌入式、物联网、逆向工程、软件安全、移动互联网、 C 语言核心系统开发工程师等诸多领域的学生、爱好者和从业人员提供些许帮助——而这也 是我作为一名计算机行业从业人员的愿望。 在开始本书的翻译工作前,我自诩具有尚可的文字感知和表达能力,在多年的学习和工 作中也阅读过计算机行业多个不同领域的大量中英文文档,力图以“信、达、雅”的原则要 求自己,从一名计算机行业一线从业者的角度,在尽可能正确地理解了原著英文意思后,用 尽可能专业的语言进行表述,避免出现读者“感觉还不如直接去看英本原版”的情况。但是, 2017 年 4 月 20 日我拿到本书的部分原稿并开始着手翻译后,我发现在“信、达、雅”三者间 做好平衡着实不是一件易事。受精力和能力所限,我也并未在实际生产代码中使用过原著中 讲解的所有机制,所以译文中也一定会有诸多不妥、失误甚至错误,如果读者有任何意见或 建议可以直接通过我的邮箱(mlkui@163.com)或 QQ 读者交流群(QQ 群号:662640785) 联系我,我会虚心接受一切批评和指正。
最后,我要感谢我的父母、妻子及亲人们多年来给予的无限关心、支持和陪伴,你们是 我今天幸福生活的缔造者和组成者,也是我奋斗的根本动力和首要原因。 感谢中国民生银行、中国民生银行总行信息科技部的领导和同事们,尽管他们中的一些 已经离开。中国民生银行是我走上社会后的第一个工作单位,感谢他们自我 2012 年入行实 习以来在工作和生活上给予的无限支持、认可、包容和指点。 感谢中学、本科及研究生的朋友、同学、老师和团队,感谢他们多年以来给予的陪伴、 认可和信任,也祝愿我们在未来有机会携手共创辉煌。 感谢电子工业出版社及其计算机图书分社博文视点,感谢博文视点符隆美编辑的认可和 信任,感谢他们在本书引进并最终出版发行全过程中的卓越眼光和艰辛努力。 这是我自己真正署名的第一本技术书籍,尽管翻译本书带来的经济收入(我会把本书微 薄的版税收入全部用于 Lua 语言中文官方网站http://www.lua-lang.org.cn的日常服务器 及带宽开支,并捐献给其他投入国内 Lua 语言推广的相关组织和活动)与我投入的精力完全 不成正比,与我耗费相同时间从事其他工作所能带来的直接利益无法相提并论,但是,我想, 我终于可以给这个世界留下点什么了。 真诚希望我的劳动能够帮助更多有需要的人,帮助他们创造更多的价值!
梅隆魁 2017 年 7 月于北京
前言
1993 年,当我和 Waldemar、Luiz 开发 Lua 语言时,我们并没有想象到它会像今天这样 被如此广泛地使用。当年,Lua 语言只是为了两个特定项目而开发的实验室项目;如今,Lua 语言被大量应用于需要一门简明、可扩展、可移植且高效的脚本语言的领域中,例如嵌入式 系统、移动设备、物联网,当然还有游戏。 Lua 语言从一开始就被设计为能与 C/C++ 及其他常用语言开发的软件集成在一起使用 的语言,这种设计带来了非常多的好处。一方面,Lua 语言不需要在性能、与三方软件交互 等 C 语言已经非常完善的方面重复“造轮子”,可以直接依赖 C 语言实现上述特性,因而 Lua 语言非常精简;另一方面,通过引入安全的运行时环境、自动内存管理、良好的字符串 处理能力和可变长的多种数据类型,Lua 语言弥补了 C 语言在非面向硬件的高级抽象能力、 动态数据结构、鲁棒性、调试能力等方面的不足。 Lua 语言强大的原因之一就在于它的标准库,这不是偶然,毕竟扩展性本身就是 Lua 语 言的主要能力之一。Lua 语言中的许多特性为扩展性的实现提供了支持:动态类型使得一定 程度的多态成为了可能,自动内存管理简化了接口的实现(无须关心内存的分配/释放及处 理溢出),作为第一类值的函数支持高度的泛化,从而使得函数更加通用。 Lua 语言除了是一门可扩展的语言外,还是一门胶水语言(glue language)。Lua 语言支 持组件化的软件开发方式,通过整合已有的高级组件构建新的应用。这些组件通常是通过 C/C++ 等编译型强类型语言编写的,Lua 语言充当了整合和连接这些组件的角色。通常,组 件(或对象)是对程序开发过程中相对稳定逻辑的具体底层(如小部件和数据结构)的抽 象,这些逻辑占用了程序运行时的大部分 CPU 时间,而产品生命周期中可能经常发生变化 的逻辑则可以使用 Lua 语言来实现。当然,除了整合组件外,Lua 语言也可以用来适配和改 造组件,甚至创建全新的组件。 诚然,Lua 语言并非这个世界上唯一的脚本语言,还有许多其他的脚本语言提供了类似 的能力。尽管如此,Lua 语言的很多特性使它成为解决许多问题的首选,这些特性如下。 可扩展: Lua 语言具有卓越的可扩展性。Lua 的可扩展性好到很多人认为 Lua 超越了编 程语言的范畴,其甚至可以成为一种用于构建领域专用语言(Domain-Specific Language,DSL)的工具包。Lua 从一开始就被设计为可扩展的,既支持使用 Lua 语言代码来扩展, 也支持使用外部的 C 语言代码来扩展。在这一点上有一个很好的例证:Lua 语言的大部 分基础功能都是通过外部库实现的。我们可以很容易地将 Lua 与 C/C++、Java、C# 和 Python 等结合在一起使用。 简明: Lua 语言是一门精简的语言。尽管它本身具有的概念并不多,但每个概念都很 强大。这样的特性使得 Lua 语言的学习成本很低,也有助于减小其本身的大小(其包含 所有标准库的 Linux 64 位版本仅有 220 KB)。 高效: Lua 语言的实现极为高效。独立的性能测试说明 Lua 语言是脚本语言中最快的 语言之一。 可移植: Lua 语言可以运行在我们听说过的几乎所有平台之上,包括所有的类 UNIX 操作系统(Linux、FreeBSD 等)、Windows、Android、iOS、OS X、IBM 大型机、游戏 终端(PlayStation、Xbox、Wii 等)、微处理器(如 Arduino)等。针对所有这些平台的 源码本质上是一样的,Lua 语言遵循 ANSI(ISO)C 标准,并未使用条件编译来对不同 平台进行代码的适配。因此,当需要适配新平台时,只要使用对应平台下的 ISO C 编译 器重新编译 Lua 语言的源码就可以了。
预期读者
除了本书的最后一部分(其中讨论了 Lua 语言的 C 语言 API)外,阅读本书并不需要对 Lua 语言或其他任何一种编程语言有预先了解。不过,阅读本书的确需要了解一些基本的编 程概念,尤其是变量与赋值、控制结构、函数与参数、流与文件及数据结构等。 Lua 语言有三类典型用户:在应用程序中嵌入式地使用 Lua 语言的用户、单独使用 Lua 语言的用户,以及和 C 语言一起使用 Lua 语言的用户。 诸如 Adobe Lightroom、Nmap 和魔兽世界等在内的许多应用程序中嵌入式地使用了 Lua 语言。这些应用使用 Lua 语言的 C 语言 API 去注册新函数、创建新类型和改变部分运算符 的行为,以最终达到将 Lua 语言用于特定领域的目的。一般情况下,这些应用的用户根本感 受不到 Lua 语言其实是一门被用于特定领域的独立编程语言。例如,Lightroom 插件的很多 开发者压根儿不知道他们使用的是 Lua 语言,Nmap 的用户也倾向于将 Lua 语言视为 Nmap 脚本引擎所使用的语言,魔兽世界的很多玩家也认为 Lua 语言是这个游戏所独有的。尽管应用场景各异,Lua 语言的核心是相同的,本书中将要讲的编程技巧也都是适用的。除了用于文本处理和用后即弃的小程序外,作为一门独立的编程语言,Lua 语言也同样 适用于大中型项目。对于这些应用而言,Lua 语言的主要能力源于标准库。例如,标准库提 供了模式匹配和其他字符串处理函数。随着 Lua 语言不断改进对标准库的支持,第三方库的 数量在不断增加。LuaRocks 是一个 Lua 语言模块的部署和管理系统,该系统在 2015 年管理了 1000 多个涵盖各个领域的模块。 最后,还有一部分程序员会在编写程序时将 Lua 语言当作 C 语言的一个标准库来使用。 他们通常更多地用 C 语言(相对于 Lua 语言)来进行编码,但是只有较好地理解了 Lua 语 言才能写出简单易用且便于二者集成的接口。
全书结构
本书的这一版本增加了针对很多领域的新内容和示例,包括沙盒、协程以及日期和时间 处理。此外,还增加了 Lua 5.3 的相关内容,包括整型值、位运算及无符号整型值等。 更具体地说,这一版对全书结构进行了重大的重构。在本版中,笔者尝试围绕编程中的 常见主题来组织内容,而不是围绕编程语言(例如分章节介绍每个标准库)去组织内容。新 的组织方式来自于 Lua 语言教学的实际经验,它能帮助读者从简单的主题开始循序渐进地学 习。特别地,笔者认为这一版的组织方式让本书成为了 Lua 语言相关课程的一份更好的教学 资源。 和前几版一样,本书共由 4 个部分组成,每个部分包括 9 章左右的内容,各有侧重。 第1部分涵盖了 Lua 语言的基础知识(因此这一部分被命名为语言基础),主要围绕数 值、字符串、表和函数等几种主要数据类型,也对基本输入/输出模型和 Lua 语言的整体语 法进行了介绍。 第2部分为编程实操,涵盖了在其他类似编程语言中也经常涉及的高级主题,如闭包、模 式匹配、时间和日期处理、数据结构、模块和错误处理等。 第3部分为语言特性。顾名思义,这一部分介绍了 Lua 语言与其他语言相比的不同之处, 如元表及其使用、环境、弱引用表、协程和反射等高级特性。 最后,和以前的版本一样,本书的第4部分介绍了 Lua 语言和 C 语言之间的 API,以便 于使用 C 语言的开发者能够发挥出 Lua 语言的全部能力。由于在这一部分中将使用 C 语言 而非 Lua 语言进行编程,所以这一部分和本书的其他部分大相径庭。一些读者可能对 Lua 语 言的 C 语言 API 毫无兴趣,而其他一些读者可能觉得这一部分是本书中最有意义的部分。在本书的所有部分中,我们都专注于不同的语言结构,并且使用了大量的示例和练习来 演示如何将这些语言结构应用于实际需求中。在一些章节之间,我们也设置了几个“插曲”, 每个“插曲”都提供了一个简短但完整的 Lua 语言程序,以帮助读者建立对 Lua 语言的更多 整体认识。
其他资源
官方文档是所有真正希望学习一门语言的人所必须具备的资料。本书无意取代 Lua 语言 官方文档。相反,本书是对官方文档的补充。一方面,官方文档只描述了 Lua 语言,其中既 没有代码实例,也没有语言结构的基本原理。另一方面,官方文档覆盖了 Lua 语言的所有内 容,本书则跳过了 Lua 语言中的一些极少使用的边边角角。此外,官方文档是有关 Lua 语言 最权威的文档,本书中任何与官方文档不同的地方都应该以官方文档为准。我们可以在 Lua 语言的官方网站 http://www.lua.org 上找到官方文档和其他的更多内容。 此外,在 Lua 语言的用户社区 http://lua-users.org 中也有不少有用的信息。与其他 资源相比,用户社区提供了教程、第三方库列表、文档以及 Lua 语言官方邮件列表的存档等 资料。 本书内容基于 Lua 5.3 版本,不过书中的大部分内容对于老版本和可能的后续版本同样 适用。Lua 5.3 和 Lua 5.x 老版本之间的区别都已经被清晰地描述了出来;如果读者使用的是 本书出版后更新的版本,那么也可以在官方文档中找到相应版本之间的具体差异。
运行示例
运行本书中的示例需要使用 Lua 语言解释器。尽管理想情况下应该使用 Lua 5.3 版本, 但本书中的大部分示例无须修改也能在旧版本中运行。可以从 Lua 语言的官网(http://www.lua.org)上下载解释器的源码。如果读者知道如 何使用 C 语言编译器在自己的机器上编译 C 代码,那么建议尝试从源码编译并安装 Lua 语 言(这非常简单)。Lua Binaries 网站(搜索 luabinaries)为大多数主流平台提供了已经编 译好的 Lua 语言解释器。如果读者使用的是 Linux 或者其他的类 UNIX 操作系统,那么通常 在软件库中已经提供了 Lua 语言执行环境,很多个发行版中已经提供了 Lua 语言相关的包。 Lua 语言有几种集成开发环境(IDE),在搜索引擎中搜一下就可以找到(尽管如此,笔 者还是推荐 Windows 下的命令行接口或者其他操作系统下的文本编辑器,尤其是对于初学者而言)。
致谢
从本书第 1 版发行到现在已经十余年了。在这十余年中,很多朋友和机构都给予过很多 帮助。 像过去一样,Luiz Henrique de Figueiredo、Waldemar Celes 和 Lua coauthors 给予了很多帮 助。Reuben Thomas、Robert Day、André Carregal、Asko Kauppi、Brett Kapilik、Diego Nehab、 Edwin Moragas、Fernando Jefferson、Gavin Wraith、John D. Ramsdell 和 Norman Ramsey 提出 了无数的建议,也为丰富本书第 4 版的内容提供了很多启发。Luiza Novaes 为本书的封面设 计提供了关键性的支持。 感谢 Lightning Source 公司在本书印刷和发行过程中表现出的可靠和高效。如果没有他 们的帮助,自己出版本书几乎是不可能的。 感谢 Marcelo Gattass 领导的 Tecgraf,他们从 1993 年 Lua 项目诞生到 2005 年期间一直 为 Lua 语言提供资助,并且仍在以很多方式持续地推动 Lua 语言的发展。 我还要感谢里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro,PUCRio)和巴西国家研究理事会(Brazilian National Research Council,CNPq),感谢他们对我工 作的一贯支持。如果没有 PUC-Rio 为我提供的环境,那么 Lua 语言项目的开发根本不可能 进行。 最后,我必须向 Noemi Rodriguez 表达我最诚挚的感谢(包括技术方面和非技术方面), 感谢她点亮了我的生活。

目录

第 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 if then 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 部分 编程实操 90
9 闭包 91
9.1 函数是第一类值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.2 非全局函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9.3 词法定界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9.4 小试函数式编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 10 模式匹配 105
10.1 模式匹配的相关函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.1.1 函数 string.find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.1.2 函数 string.match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
10.1.3 函数 string.gsub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.1.4 函数 string.gmatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
10.3 捕获 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
10.4 替换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
10.4.1 URL 编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
10.4.2 制表符展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
10.5 诀窍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
11 小插曲:出现频率最高的单词 124
11.1 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
12 日期和时间 128
12.1 函数 os.time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
12.2 函数 os.date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
12.3 日期和时间处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
12.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
13 位和字节 135
13.1 位运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
13.2 无符号整型数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
13.3 打包和解包二进制数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
13.4 二进制文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
13.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 14 数据结构 145
14.1 数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
14.2 矩阵及多维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
14.3 链表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
14.4 队列及双端队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
14.5 反向表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
14.6 集合与包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
14.7 字符串缓冲区 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
14.8 图形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
14.9 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
15 数据文件和序列化 159
15.1 数据文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
15.2 序列化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
15.2.1 保存不带循环的表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
15.2.2 保存带有循环的表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
15.3 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
16 编译、执行和错误 171
16.1 编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
16.2 预编译的代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
16.3 错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
16.4 错误处理和异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
16.5 错误信息和栈回溯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
16.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
17 模块和包 184
17.1 函数 require . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
17.1.1 模块重命名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 17.1.2 搜索路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
17.1.3 搜索器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
17.2 Lua 语言中编写模块的基本方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
17.3 子模块和包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
17.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
第 3 部分 语言特性 196
18 迭代器和泛型 for 197
18.1 迭代器和闭包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
18.2 泛型 for 的语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
18.3 无状态迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
18.4 按顺序遍历表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
18.5 迭代器的真实含义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
18.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
19 小插曲:马尔可夫链算法 208
19.1 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
20 元表和元方法 212
20.1 算术运算相关的元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
20.2 关系运算相关的元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
20.3 库定义相关的元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
20.4 表相关的元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
20.4.1 __index 元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
20.4.2 __newindex 元方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
20.4.3 具有默认值的表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
20.4.4 跟踪对表的访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
20.4.5 只读的表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
20.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 21 面向对象(Object-Oriented)编程 226
21.1 类(Class) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
21.2 继承(Inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
21.3 多重继承(Multiple Inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . 232
21.4 私有性(Privacy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
21.5 单方法对象(Single-method Object) . . . . . . . . . . . . . . . . . . . . . . . . 237
21.6 对偶表示(Dual Representation) . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
21.7 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
22 环境(Environment) 241
22.1 具有动态名称的全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
22.2 全局变量的声明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
22.3 非全局环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
22.4 使用 _ENV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
22.5 环境和模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
22.6 _ENV 和 load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
22.7 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
23 垃圾收集 255
23.1 弱引用表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
23.2 记忆函数(Memorize Function) . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
23.3 对象属性(Object Attribute) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
23.4 回顾具有默认值的表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
23.5 瞬表(Ephemeron Table) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
23.6 析构器(Finalizer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
23.7 垃圾收集器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
23.8 控制垃圾收集的步长(Pace) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
23.9 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 24 协程(Coroutine) 270
24.1 协程基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
24.2 哪个协程占据主循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
24.3 将协程用作迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
24.4 事件驱动式编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
24.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
25 反射(Reflection) 285
25.1 自省机制(Introspective Facility) . . . . . . . . . . . . . . . . . . . . . . . . . . 286
25.1.1 访问局部变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
25.1.2 访问非局部变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
25.1.3 访问其他协程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
25.2 钩子(Hook) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
25.3 调优(Profile) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
25.4 沙盒(Sandbox) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
25.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
26 小插曲:使用协程实现多线程 301
26.1 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
第 4 部分 C 语言 API 307
27 C 语言 API 总览 308
27.1 第一个示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
27.2 栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
27.2.1 压入元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
27.2.2 查询元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
27.2.3 其他栈操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
27.3 使用 C API 进行错误处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 27.3.1 处理应用代码中的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
27.3.2 处理库代码中的错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
27.4 内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
27.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
28 扩展应用 325
28.1 基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
28.2 操作表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
28.2.1 一些简便方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
28.3 调用 Lua 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
28.4 一个通用的调用函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
28.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
29 在 Lua 中调用 C 语言 339
29.1 C 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
29.2 延续(Continuation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
29.3 C 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
29.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
30 编写 C 函数的技巧 349
30.1 数组操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
30.2 字符串操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
30.3 在 C 函数中保存状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
30.3.1 注册表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
30.3.2 上值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
30.3.3 共享的上值(Shared upvalue) . . . . . . . . . . . . . . . . . . . . . . . . 361
30.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 31 C 语言中的用户自定义类型 363
31.1 用户数据(Userdata) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
31.2 元表(Metatable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
31.3 面向对象访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
31.4 数组访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
31.5 轻量级用户数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
31.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
32 管理资源 376
32.1 目录迭代器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
32.2 XML 解析器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
32.3 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
33 线程和状态 392
33.1 多线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
33.2 Lua 状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
33.3 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406

读者评论

  • 博主,问第一节 阶乘输入负数直接 提示一大串代码 所依答案怎么写

    761317247发表于 2022/7/14 18:15:52
    • 重新写条件语句和分状态对待。其实也可以用elisp来重写:
      (defun factorial (n)
      (if (zerop n)
      1
      (* n (factorial (1- n)))))
      不过无法处理负数。
      我用lua这样写:
      function fact (n)
      if n== 0 then
      return 1
      elseif n < 0
      return n * fact ( - n -1)
      else
      return n * fact ( n -1 )
      end
      end
      print(fact( -3))
      output: -6
      -6
      因此我觉得可以针对这个数是>0 还是 < 0 写 两个相似的func,在 n < 0 只需要在 fact ( - n -1)就可以了。
      Good luck to you.
      愿世界“傻人傻劲”再多一些.

      ljf7发表于 2023/2/24 9:44:15
  • 第116页第一个例子,最后一行输出应该为
    Lua is great, isn't it? 2
    书本上少了一个2

    SteveLiu发表于 2021/9/12 13:40:15
  • 81页12行有误
    if op == "+" the应为if open == "+" then

    WoodsGao发表于 2020/9/10 18:51:23
  • 继续纠错二:28.5示例中,参数个数narg在28.6没看到累加

    planck发表于 2020/8/22 15:38:06
    • 感谢提示,我们和译者确认一下。

      符隆美发表于 2020/8/28 10:46:06
  • 实例28.3有误,不存在colorname变量,应该是name变量,colorname和name变量应该是同一个

    planck发表于 2020/8/22 11:48:24
    • 感谢提示,我们和译者确认一下。

      符隆美发表于 2020/8/28 10:46:12

相关图书

Python编程与3D物理学仿真(视频版)

张继春 (作者)

本书将Python编程和物理力学知识同步结合起来,通过编程将物理概念和物理过程进行3D可视化展 现,帮助读者在3D场景下加深对物理知识的理解和掌握,从而培养读者...

¥89.90

Photoshop设计师精通之道:摄影+平面+UI+网店实战全解

委婉的鱼 (作者)

近些年,Photoshop软件在平面设计、广告摄影、影像创意、网页制作、后期修饰、视觉创意及界面 设计中的重要地位越来越不可被撼动,学好Photoshop是一个...

¥62.30

利用Python轻松学数学

蹇 彤 (作者)

本书将Python编程的基本知识和中小学数学知识紧密结合起来,在介绍Python知识的同时穿插数学趣题和难题的讲解,以引导读者从一个全新的角度来看待编程、体验编...

¥69.00

Python接口自动化测试

王浩然 (作者)

本书主要介绍如何用Python实现接口自动化测试。全书主要内容包括接口基础、接口手工测试、编程前的准备、用Python处理MySQL数据库、用Python发送H...

¥59.00

Python编程之美:最佳实践指南

Reitz,Schlusser (作者) 夏永锋 (译者)

本书是Python用户的一本百科式学习指南,由Python社区数百名成员协作奉献。<br>全书内容分为三大部分。第一部分是关于如何配置使用Python编辑工具的...

¥89.00

Python网络安全教科书

胡松涛 (作者)

本书是一本黑客技术的入门实战书籍,从最初的工具选择,一直到最后的攻击演示,由浅入深地引导读者全面系统地掌握网络安全防范技术,借助Python打造更安全的网络。<...

¥69.00