LUA程序设计【第一篇】.doc

上传人:11****ws 文档编号:2124442 上传时间:2019-04-29 格式:DOC 页数:53 大小:404.50KB
下载 相关 举报
LUA程序设计【第一篇】.doc_第1页
第1页 / 共53页
LUA程序设计【第一篇】.doc_第2页
第2页 / 共53页
LUA程序设计【第一篇】.doc_第3页
第3页 / 共53页
LUA程序设计【第一篇】.doc_第4页
第4页 / 共53页
LUA程序设计【第一篇】.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、Lua 程序设计版权声明译序第一篇 语言第 0 章 序言0.1 序言0.2 Lua 的使用者0.3 Lua 的相关资源0.4 本书的体例0.5 关于本书0.6 感谢第 1 章 起点1.1 Chunks1.2 全局变量1.3 词法约定1.4 命令行方式第 2 章 类型和值2.1 Nil2.2 Booleans2.3 Numbers2.4 Strings2.5 Functions2.6 Userdata and Threads第 3 章 表达式3.1 算术运算符3.2 关系运算符3.3 逻辑运算符3.4 连接运算符3.5 优先级3.6 表的构造第 4 章 基本语法4.1 赋值语句4.2 局部变量与

2、代码块(block)4.3 控制结构语句4.4 break 和 return 语句第 5 章 函数5.1 多返回值5.2 可变参数5.3 命名参数第 6 章 再论函数6.1 闭包6.2 非全局函数6.3 正确的尾调用(Proper Tail Calls)第 7 章 迭代器与泛型 for7.1 迭代器与闭包7.2 范性 for 的语义7.3 无状态的迭代器7.4 多状态的迭代器7.5 真正的迭代器第 8 章 编译运行错误信息8.1 require 函数8.2 C Packages8.3 错误8.4 异常和错误处理8.5 错误信息和回跟踪(Tracebacks)第 9 章 协同程序9.1 协同的基

3、础9.2 管道和过滤器9.3 用作迭代器的协同9.4 非抢占式多线程第 10 章 完整示例10.1 Lua 作为数据描述语言使用10.2 马尔可夫链算法第二篇 tables 与 objects第 11 章 数据结构11.1 数组11.2 矩阵和多维数组11.3 链表11.4 队列和双向队列11.5 集合和包11.6 字符串缓冲第 12 章 数据文件与持久化12.1 序列化12.1.1 保存不带循环的 table12.1.2 保存带有循环的 table第 13 章 Metatables and Metamethods13.1 算术运算的 Metamethods13.2 关系运算的 Metamet

4、hods13.3 库定义的 Metamethods13.4 表相关的 Metamethods13.4.1 The _index Metamethod13.4.2 The _newindex Metamethod 13.4.3 有默认值的表13.4.4 监控表13.4.5 只读表第 14 章 环境14.1 使用动态名字访问全局变量14.2 声明全局变量14.3 非全局的环境第 15 章 Packages15.1 基本方法15.2 私有成员(Privacy )15.3 包与文件15.4 使用全局表15.5 其他一些技巧(Other Facilities)第 16 章 面向对象程序设计16.1 类1

5、6.2 继承16.3 多重继承16.4 私有性(privacy)16.5 Single-Method 的对象实现方法第 17 章 Weak 表17.1 记忆函数17.2 关联对象属性17.3 重述带有默认值的表第三篇 标准库第 18 章 数学库第 19 章 Table 库19.1 数组大小19.2 插入/删除19.3 排序第 20 章 String 库20.1 模式匹配函数20.2 模式20.3 捕获(Captures )20.4 转换的技巧(Tricks of the Trade)第 21 章 IO 库21.1 简单 I/O 模式21.2 完全 I/O 模式21.2.1 I/O 优化的一个小

6、技巧21.2.2 二进制文件21.3 关于文件的其它操作第 22 章 操作系统库22.1 Date 和 Time22.2 其它的系统调用第 23 章 Debug 库23.1 自省(Introspective)23.1.1 访问局部变量23.1.2 访问 Upvalues23.2 Hooks23.3 Profiles第四篇 C API第 24 章 C API 纵览24.1 第一个示例程序24.2 堆栈24.2.1 压入元素24.2.2 查询元素24.2.3 其他堆栈操作24.3 C API 的错误处理24.3.1 应用程序中的错误处理24.3.2 类库中的错误处理第 25 章 扩展你的程序25.

7、1 表操作25.2 调用 Lua 函数25.3 通用的函数调用第 26 章 调用 C 函数26.1 C 函数26.2 C 函数库第 27 章 撰写 C 函数的技巧27.1 数组操作27.2 字符串处理27.3 在 C 函数中保存状态27.3.1 The Registry27.3.2 References27.3.3 Upvalues第 28 章 User-Defined Types in C28.1 Userdata28.2 Metatables28.3 访问面向对象的数据28.4 访问数组28.5 Light Userdata第 29 章 资源管理29.1 目录迭代器29.2 XML 解析第

8、四篇 附录A. 终端机控制符第一篇 语言第 0 章 序言本章包括作者的序言、文章的体例(convention)以及其它一些“每本书开头都会的内容”。0.1 序言目前很多程序语言都专注于帮你编写成千上万行的代码,所以此类型的语言所提供的包、命名空间、复杂的类型系统及无数的结构,有上千页的文档需要操作者学习。而 Lua 并不帮你编写大量的代码的程序,相反的,Lua 仅让你用少量的代码解决关键问题。为实现这个目标,像其他语言一样 Lua 依赖于其可扩展性。但是与其他语言不同的是,不仅用 Lua 编写的软件易于扩展,而且用其他语言比如 C/C+编写的软件也很容易使用 Lua 扩展其功能。一开始,Lua

9、 就被设计成很容易和传统的 C/C+整合的语言。这种语言的二元性带来了极大的好处。Lua 是一个小巧而简单的语言,因为 Lua 不致力于做 C 语言已经做得很好的领域,比如:性能、底层操作以及与第三方软件的接口。Lua 依赖于 C 去做完成这些任务。Lua 所提供的机制是 C 不善于的:高级语言、动态结构、简洁、易于测试和调试等。正因为如此,Lua 具有良好的安全保证,自动内存管理,简便的字符串处理功能及其他动态数据的改变。Lua 不仅是一种易于扩展的语言,也是一种易整合语言(glue language);Lua 支持基于组件的,我们可以将一些已经存在的高级组件整合在一起实现一个应用软件。一般

10、情况下,组件使用像 C/C+等静态的语言编写。但 Lua 是我们整合各个组件的粘合剂。又通常情况下,组件(或对象)表现为具体在程序开发过程中很少变化的、占用大量 CPU 时间的决定性的程序,例如窗口部件和数据结构。对那种在产品的生命周期内变化比较多的应用方向使用 Lua 可以更方便的适应变化。除了作为整合语言外,Lua 自身也是一个功能强大的语言。Lua 不仅可以整合组件,还可以编辑组件甚至完全使用 Lua 创建组件。除了 Lua 外,还有很多类似的脚本语言,例如:Perl、Tcl、Ruby、Forth、Python 。虽然其他语言在某些方面与 Lua 有着共同的特色,但下面这些特征是 Lua

11、 特有的: 可扩展性。Lua 的扩展性非常卓越,以至于很多人把 Lua 用作搭建领域语言的工具(注:比如游戏脚本)。Lua 被设计为易于扩展的,可以通过 Lua 代码或者 C 代码扩展,Lua 的很多功能都是通过外部库来扩展的。Lua 很容易与C/C+、 java、fortran 、Smalltalk、Ada,以及其他语言接口。 简单。Lua 本身简单,小巧;内容少但功能强大,这使得 Lua 易于学习,很容易实现一些小的应用。他的完全发布版(代码、手册以及某些平台的二进制文件)仅用一张软盘就可以装得下。 高效率。Lua 有很高的执行效率,统计表明 Lua 是目前平均效率最高的脚本语言。 与平台

12、无关。Lua 几乎可以运行在所有我们听说过的系统上,如NextStep、OS/2、PlayStation II (Sony)、Mac OS-9、OS X、BeOS、MS-DOS、IBM mainframes、EPOC、PalmOS、MCF5206eLITE Evaluation Board、RISC OS,及所有的 Windows 和 Unix。Lua 不是通过使用条件编译实现平台无关,而是完全使用ANSI (ISO) C,这意味着只要你有 ANSI C 编译器你就可以编译并使用 Lua。Lua 大部分强大的功能来自于他的类库,这并非偶然。Lua 的长处之一就是可以通过新类型和函数来扩展其功能

13、。动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出。高级函数和匿名函数均可以接受高级参数,使函数更为通用。Lua 自带一个小规模的类库。在受限系统中使用 Lua,如嵌入式系统,我们可以有选择地安装这些类库。若运行环境十分严格,我们甚至可以直接修改类库源代码,仅保留需要的函数。记住:Lua 是很小的(即使加上全部的标准库)并且在大部分系统下你仍可以不用担心的使用全部的功能。0.2 Lua 的使用者Lua 使用者分为三大类:使用 Lua 嵌入到其他应用中的、独立使用 Lua 的、将 Lua 和C 混合使用的。第一:很多人

14、使用 Lua 嵌入在应用程序,比如 CGILua(搭建动态网页)、LuaOrb(访问 CORBA 对象。这些类型用 Lua-API 注册新函数,创建新类型,通过配置Lua 就可以改变应用宿主语言的行为。通常,这种应用的使用者并不知道 Lua 是一种独立的语言。例如:CGILua 用户一般会认为 Lua 是一种用于 Web 的语言。第二:作为一种独立运行的语言,Lua 也是很有用的,主要用于文本处理或者只运行一次的小程序。这种应用 Lua 主要使用它的标准库来实现,标准库提供模式匹配和其它一些字串处理的功能。我们可以这样认为:Lua 是文本处理领域的嵌入式语言。第三:还有一些使用者使用其他语言开

15、发,把 Lua 当作库使用。这些人大多使用 C 语言开发,但使用 Lua 建立简单灵活易于使用的接口。本书面向以上三类读者。书的第一部分阐述了语言的本身,展示语言的潜在功能。我们讲述了不同的语言结构,并用一些例子展示如何解决实际问题。这部分既包括基本的语言的控制结构,也包括高级的迭代子和协同。第二部分重点放在 Lua 特有的数据结构tables 上,讨论了数据结构、持久性、包及面向对象编程,这里我们将看到 Lua 的真正强大之处。第三部分介绍标准库。每个标准库一章:数学库、table 库、string 库、I/O 库、OS 库、Debug 库。最后一部分介绍了 Lua 和 C 接口的 API,

16、这部分介绍在 C 语言中开发应用而不是 Lua中,应用对于那些打算将 Lua 嵌入到 C/C+中的读者可能会对此部分更感兴趣。0.3 Lua 的相关资源如果你真得想学一门语言,参考手册是必备的。本书和 Lua 参考手册互为补充,手册仅仅描述语言本身,因此他既不会告诉你语言的数据结构也不会举例说明,但手册是 Lua的权威性文档,http:/www.lua.org 可以得到手册的内容。- Lua 用户社区,提供了一些第三方包和文档http:/lua-users.org- 本书的更新勘误表,代码和例子http:/www.inf.puc-rio.br/roberto/book/另外本书仅针对 Lua

17、5.0,如果你的版本不同,请查阅 Lua 手册或者比较版本间的差异。0.4 本书的体例字符串使用双引号,比如“literal strings“;单字符使用单引号,比如 a;模式串也是用单引号,比如%w_*。符号 表示语句的输出或者表达式的结果: print(10) 1013 + 3 16符号 表示等价,即对于 Lua 来说,用 this 与 that 没有区别。this that0.5 关于本书开始打算写这本书是 1998 年冬天(南半球) ,那时候 Lua 版本是 3.1;2000 年v4.0;2003 年 v5.0。很明显的是,这些变化给本书带来很大的冲击,有些内容失去了它存在理由,比如关

18、于超值(upvalues )的复杂的解释。一些章节被重写,比如 C API,另外一些章节被增加进来,比如协同处理。不太明显的是,Lua 语言本身的发展对本书的完成也产生了很大的影响。一些语言的变化在本书中并没有被涵盖进来,这并非偶然的。在本书的创作过程中,有的时候在某个章节我会突然感觉很困惑,因为我不知道该从何开始或者怎样去讲问题阐述清楚。当你想尽力去解释清楚如何使用的前提是你应该觉得使用这个东西很容易,这表明 Lua 某些地方需要被改进。还有的时候,我顺利的写完某个章节,结果却是没有人能看得懂我写的或者没有人对我在这个章节内表达的观点达成一致。大部分情况下,这是我的过错因为我是个作家,偶尔我

19、也会因此发现语言本身的一些需要改进的缺陷(举例来说,从 upvalues 到lexical scoping 的转变是由无意义的尝试所带来的抱怨所引发的,在此书的先前的草稿里,把 upvalues 形容成是 lexical scoping 的一种)。本书的完成必须服从语言的变化,本书在这个时候完成的原因:Lua 5.0 是一个成熟的版本语言变得越来越大,超出了最初本书的目标。此外一个原因是我迫切的想将 Lua 介绍给大家让更多的人了解 Lua。0.6 感谢在完成本书的过程中,很多人给了我极大的帮助:Luiz Henrique de Figueiredo 和 Waldemar Celes 给了我很

20、大的帮助,使得本书能够更好完成,Luiz Henrique 也帮助设计了本书的内部。Noemi Rodriguez, Andr Carregal, Diego Nehab, 以及 Gavin Wraith 阅读了本书的草稿提出了很多有价值的建议。Renato Cerqueira, Carlos Cassino, Toms Guisasola, Joe Myers 和 Ed Ferguson 也提出了很多重要的建议。Alexandre Nakonechnyj 负责本书的封面和内部设计。Rosane Teles 负责 CIP 数据的准备。谢谢他们所有人。第 1 章 起点写一个最最简单的程序Hell

21、o World 。print(“Hello World“)假定你把上面这句保存在 hello.lua 文件中,你在命令行只需要:prompt lua hello.lua看到结果了吗?让我们来看一个稍微复杂点的例子:- defines a factorial functionfunction fact (n)if n = 0 thenreturn 1elsereturn n * fact(n-1)endendprint(“enter a number:“)a = io.read(“*number“) - read a numberprint(fact(a)这个例子定义了一个函数,计算输入参数 n

22、 的阶乘;本例要求用户输入一个数字 n,然后打印 n 的阶乘。1.1 ChunksChunk 是一系列语句,Lua 执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个 Chunk。每个语句结尾的分号(;)是可选的,但如果同一行有多个语句最好用;分开a = 1 b = a*2 - ugly, but valid一个 Chunk 可以是一个语句,也可以是一系列语句的组合,还可以是函数,Chunk 可以很大,在 Lua 中几个 MByte 的 Chunk 是很常见的。你还可以以交互模式运行 Lua,不带参数运行 Lua:Lua 5.0 Copyright 1994-2003 Tecgraf

23、, PUC-Rio 你键入的每个命令(比如:“Hello World“)在你键入回车之后立即被执行,键入文件结束符可以退出交互模式(Ctrl-D in Unix, Ctrl-Z in DOS/Windows),或者调用 OS 库的os.exit()函数也可以退出。在交互模式下,Lua 通常把每一个行当作一个 Chunk,但如果 Lua 一行不是一个完整的 Chunk 时,他会等待继续输入直到得到一个完整的 Chunk.在 Lua 等待续行时,显示不同的提示符(一般是).可以通过指定参数让 Lua 执行一系列 Chunk。例如:假定一个文件 a 内有单个语句x=1;另一个文件 b 有语句 pri

24、nt(x)prompt lua -la -lb命令首先在一个 Chunk 内先运行 a 然后运行 b。(注意:-l 选项会调用 require,将会在指定的目录下搜索文件,如果环境变量没有设好,上面的命令可能不能正确运行。我们将在 8.1 节详细更详细的讨论 the require function)-i 选项要求 Lua 运行指定 Chunk 后进入交互模式.prompt lua -i -la -lb将在一个 Chunk 内先运行 a 然后运行 b,最后直接进入交互模式。另一个连接外部 Chunk 的方式是使用 dofile 函数,dofile 函数加载文件并执行它.假设有一个文件:- fi

25、le lib1.luafunction norm (x, y)local n2 = x2 + y2return math.sqrt(n2)endfunction twice (x)return 2*xend在交互模式下: dofile(“lib1.lua“) - load your library n = norm(3.4, 1.0) print(twice(n) 7.0880180586677-i 和 dofile 在调试或者测试 Lua 代码时是很方便的。1.2 全局变量全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:n

26、il.print(b) nilb = 10print(b) 10如果你想删除一个全局变量,只需要将变量负值为 nilb = nilprint(b) nil这样变量 b 就好像从没被使用过一样.换句话说, 当且仅当一个变量不等于 nil 时,这个变量存在。1.2 词法约定标示符:字母(letter)或者下划线开头的字母、下划线、数字序列.最好不要使用下划线加大写字母的标示符,因为 Lua 的保留字也是这样的。Lua 中,letter 的含义是依赖于本地环境的。保留字:以下字符为 Lua 的保留字,不能当作标识符。and break do else elseifend false for func

27、tion ifin local nil not orrepeat return then true untilwhile注意:Lua 是大小写敏感的 .注释:单行注释:-多行注释:- -print(10) - no action (comment)-1.4 命令行方式lua options script args-e:直接将命令传入 Luaprompt lua -e “print(math.sin(12)“ -0.53657291800043-l:加载一个文件.-i:进入交互模式._PROMPT 内置变量作为交互模式的提示符prompt lua -i -e “_PROMPT= lua “lua

28、Lua 的运行过程,在运行参数之前,Lua 会查找环境变量 LUA_INIT 的值,如果变量存在并且值为filename,Lua 将加载指定文件。如果变量存在但不是以 开头,Lua 假定filename 为 Lua 代码文件并且运行他。利用这个特性,我们可以通过配置,灵活的设置交互模式的环境。可以加载包,修改提示符和路径,定义自己的函数,修改或者重命名函数等。全局变量 arg 存放 Lua 的命令行参数。prompt lua script a b c在运行以前,Lua 使用所有参数构造 arg 表。脚本名索引为 0,脚本的参数从 1 开始增加。脚本前面的参数从-1 开始减少。prompt lu

29、a -e “sin=math.sin“ script a barg 表如下:arg-3 = “lua“arg-2 = “-e“arg-1 = “sin=math.sin“arg0 = “script“arg1 = “a“arg2 = “b“第 2 章 类型和值Lua 是动态类型语言,变量不要类型定义。Lua 中有 8 个基本类型分别为:nil、boolean、number 、string、userdata、function、thread 和 table。函数 type 可以测试给定变量或者值的类型。print(type(“Hello world“) stringprint(type(10.4*

30、3) numberprint(type(print) functionprint(type(type) functionprint(type(true) booleanprint(type(nil) nilprint(type(type(X) string变量没有预定义的类型,每一个变量都可能包含任一种类型的值。print(type(a) nil (a is not initialized)a = 10print(type(a) numbera = “a string!“print(type(a) stringa = print - yes, this is valid!a(type(a) function注意上面最后两行,我们可以使用 function 像使用其他值一样使用(更多的介绍参考第六章)。一般情况下同一变量代表不同类型的值会造成混乱,最好不要用,但是特殊情况下可以带来便利,比如 nil。2.1 NilLua 中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为 nil;给全局变量赋 nil 可以删除该变量。2.2 Booleans

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。