
lua
andylin02
这个作者很懒,什么都没留下…
展开
-
Programming in Lua (目录)
Programming in Lua 作者:Roberto Ierusalimschy翻译:www.luachina.net Simple is beautiful 版权声明《Programming in Lua》的翻译由www.luachina.net完转载 2008-03-15 15:41:00 · 711 阅读 · 0 评论 -
第12章 数据文件与持久化
第12章 数据文件与持久化当我们处理数据文件的,一般来说,写文件比读取文件内容来的容易。因为我们可以很好的控制文件的写操作,而从文件读取数据常常碰到不可预知的情况。一个健壮的程序不仅应该可以读取存有正确格式的数据还应该能够处理坏文件(译者注:对数据内容和格式进行校验,对异常情况能够做出恰当处理)。正因为如此,实现一个健壮的读取数据文件的程序是很困难的。正如我们在Section 10.1转载 2008-03-15 15:52:00 · 567 阅读 · 0 评论 -
第14章 环境
第14章 环境Lua用一个名为environment普通的表来保存所有的全局变量。(更精确的说,Lua在一系列的environment中保存他的“global”变量,但是我们有时候可以忽略这种多样性)这种结果的优点之一是他简化了Lua的内部实现,因为对于所有的全局变量没有必要非要有不同的数据结构。另一个(主要的)优点是我们可以像其他表一样操作这个保存全局变量的表。为了简化操作,Lua将环境转载 2008-03-15 15:53:00 · 471 阅读 · 0 评论 -
第26章 调用C函数
第26章 调用C函数扩展Lua的基本方法之一就是为应用程序注册新的C函数到Lua中去。当我们提到Lua可以调用C函数,不是指Lua可以调用任何类型的C函数(有一些包可以让Lua调用任意的C函数,但缺乏便捷和健壮性)。正如我们前面所看到的,当C调用Lua函数的时候,必须遵循一些简单的协议来传递参数和获取返回结果。相似的,从Lua中调用C函数,也必须遵循一些协议来传递参数和获得返回结果。另转载 2008-03-15 16:01:00 · 740 阅读 · 0 评论 -
第0章 序言
第0章 序言本章包括作者的序言、文章的体例(convention)以及其它一些“每本书开头都会的内容”。0.1 序言目前很多程序语言都专注于帮你编写成千上万行的代码,所以此类型的语言所提供的包、命名空间、复杂的类型系统及无数的结构,有上千页的文档需要操作者学习。而Lua并不帮你编写大量的代码的程序,相反的,Lua仅让你用少量的代码解决关键问题。为实现这个目标,像其他语言一样Lua依转载 2008-03-15 15:42:00 · 512 阅读 · 0 评论 -
第15章 Packages
第15章 Packages很多语言专门提供了某种机制组织全局变量的命名,比如Modula的modules,Java和Perl的packages,C++的namespaces。每一种机制对在package中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定义转载 2008-03-15 15:54:00 · 452 阅读 · 0 评论 -
第16章 面向对象程序设计
第16章 面向对象程序设计Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。对象有他们的成员函数,表也有:Account = {balance = 0转载 2008-03-15 15:55:00 · 644 阅读 · 0 评论 -
第18章 数学库
第18章 数学库在这一章中(下面关于标准库的几章中同样)我的主要目的不是对每一个函数给出完整地说明,而是告诉你标准库能够提供什么功能。为了能够清楚地说明问题,我可能会忽略一些小的选项或者行为。主要的思想是激发你的好奇心,这些好奇之处可能在参考手册中找到答案。数学库由算术函数的标准集合组成,比如三角函数库(sin, cos, tan, asin, acos, etc.),幂指函数(exp转载 2008-03-15 15:56:00 · 536 阅读 · 0 评论 -
第20章 String库
第20章 String库Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。String库中的一些函数是非常简单的:string.len(s)返回字符串s的长度;string.rep(s, n)返回重复n次字符串s的串;你使用string.rep("a", 2^20转载 2008-03-15 15:57:00 · 994 阅读 · 0 评论 -
第22章 操作系统库
第22章 操作系统库操作系统库包含了文件管理,系统时钟等等与操作系统相关信息。这些函数定义在表(table)os中。定义该库时考虑到Lua的可移植性,因为Lua是以ANSI C写成的,所以只能使用ANSI定义的一些标准函数。许多的系统属性并不包含在ANSI定义中,例如目录管理,套接字等等。所以在系统库里并没有提供这些功能。另外有一些没有包含在主体发行版中的Lua库提供了操作系统扩展属转载 2008-03-15 15:58:00 · 547 阅读 · 0 评论 -
第23章 Debug库
第23章 Debug库debug库并不给你一个可用的Lua调试器,而是给你提供一些为Lua写一个调试器的方便。出于性能方面的考虑,关于这方面官方的接口是通过C API实现的。Lua中的debug库就是一种在Lua代码中直接访问这些C函数的方法。Debug库在一个debug表内声明了他所有的函数。与其他的标准库不同的是,你应该尽可能少的是有debug库。首先,debug库中的一些函数性能比较转载 2008-03-15 15:59:00 · 592 阅读 · 0 评论 -
第9章 协同程序
第9章 协同程序协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在转载 2008-03-15 15:51:00 · 1245 阅读 · 0 评论 -
第10章 完整示例
第10章 完整示例本章通过两个完整的例子,来展现Lua的实际应用。第一个例子来自于Lua官方网站,其展示了Lua作为数据描述语言的应用。第二个例子为马尔可夫链算法的实现,算法在Kernighan & Pike著作的Practice of Programming书中有描述。本章结束后,Lua语言方面的介绍便到此结束。后续章节将分别介绍table与面向对象(object-orient)、标准库转载 2008-03-15 15:51:00 · 528 阅读 · 0 评论 -
第17章 Weak表
第17章 Weak表Lua自动进行内存的管理。程序只能创建对象(表,函数等),而没有执行删除对象的函数。通过使用垃圾收集技术,Lua会自动删除那些失效的对象。这可以使你从内存管理的负担中解脱出来。更重要的,可以让你从那些由此引发的大部分BUG中解脱出来,比如指针挂起(dangling pointers)和内存溢出。和其他的不同,Lua的垃圾收集器不存在循环的问题。在使用循环性的数据结构转载 2008-03-15 15:55:00 · 497 阅读 · 0 评论 -
第27章 撰写C函数的技巧
第27章 撰写C函数的技巧官方的API和辅助函数库都提供了一些帮助程序员如何写好C函数的机制。在这一章我们将讨论数组操纵、string处理、在C中存储Lua值等一些特殊的机制。27.1 数组操作Lua中数组实际上就是以特殊方式使用的table的别名。我们可以使用任何操纵table的函数来对数组操作,即lua_settable和lua_gettable。然而,与Lua常规简洁思想(e转载 2008-03-15 16:02:00 · 978 阅读 · 0 评论 -
第8章 编译·运行·错误信息
第8章 编译·运行·错误信息虽然我们把Lua当作解释型语言,但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的)。在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快。我们可以说函数dofile的存在就是说明可以将Lua作为一种解释型语言被调用。前面我们介绍过dofi转载 2008-03-15 15:50:00 · 542 阅读 · 0 评论 -
第4章 基本语法
第4章 基本语法Lua像C和PASCAL几乎支持所有的传统语句:赋值语句、控制结构语句、函数调用等,同时也支持非传统的多变量赋值、局部变量声明。4.1 赋值语句赋值是改变一个变量的值和改变表域的最基本的方法。a = "hello" .. "world"t.n = t.n + 1Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次转载 2008-03-15 15:48:00 · 404 阅读 · 0 评论 -
第5章 函数
第5章 函数函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。语法:function func_name (arguments-list) statements-list;end;调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。print(8*9, 9/8)a转载 2008-03-15 15:48:00 · 430 阅读 · 0 评论 -
第6章 再论函数
第6章 再论函数Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values)。第一类值指:在Lua中函数和其他值(数值、字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值。词法定界指:嵌套的函数可以访问他外部函数中的变量。这一特性给Lua提供了强大的编程能力。Lua中关于函数稍微难以转载 2008-03-15 15:49:00 · 445 阅读 · 0 评论 -
第7章 迭代器与泛型for
第7章 迭代器与泛型for在这一章我们讨论为范性for写迭代器,我们从一个简单的迭代器开始,然后我们学习如何通过利用范性for的强大之处写出更高效的迭代器。7.1 迭代器与闭包迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道转载 2008-03-15 15:49:00 · 482 阅读 · 0 评论 -
第11章 数据结构
第11章 数据结构table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays、records、lists、queues、sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构。在传统的C语言或者Pascal语言中我们经常使用arrays和lists(record+pointer)来实现大部分的数据结构,在Lua中不仅可以用table转载 2008-03-15 15:52:00 · 535 阅读 · 0 评论 -
第13章 Metatables and
第13章 Metatables andMetamethodsLua中的table由于定义的行为,我们可以对key-value对执行加操作,访问key对应的value,遍历所有的key-value。但是我们不可以对两个table执行加操作,也不可以比较两个表的大小。Metatables允许我们改变table的行为,例如,使用Metatables我们可以定义Lua如何计算两个table的相转载 2008-03-15 15:53:00 · 549 阅读 · 0 评论 -
第19章 Table库
第19章 Table库table库由一些操作table的辅助函数组成。他的主要作用之一是对Lua中array的大小给出一个合理的解释。另外还提供了一些从list中插入删除元素的函数,以及对array元素排序函数。19.1数组大小Lua中我们经常假定array在最后一个非nil元素处结束。这个传统的约定有一个弊端:我们的array中不能拥有nil元素。对大部分应用来说这个限制不是什么转载 2008-03-15 15:56:00 · 721 阅读 · 0 评论 -
第21章 IO库
第21章 IO库I/O库为文件操作提供两种模式。简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(complete model)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。简单模式在做一些简单的文件操作时较为合适。在本书的前面部分我们一直都在使用它。但是在进行一些高级的文件操作的时候转载 2008-03-15 15:58:00 · 549 阅读 · 0 评论 -
24章 C API纵览
第四篇 C API 第24章 C API纵览Lua是一个嵌入式的语言,意味着Lua不仅可以是一个独立运行的程序包也可以是一个用来嵌入其他应用的程序库。你可能觉得奇怪:如果Lua不只是独立的程序,为什么到目前为止贯穿整本书我们都是在使用Lua独立程序呢?这个问题的答案在于Lua解释器(可执行的lua)。Lua解释器是一个使用Lua标准库实现的独立的解释器,她是转载 2008-03-15 16:00:00 · 601 阅读 · 0 评论 -
第25章 扩展你的程序
第25章 扩展你的程序作为配置语言是LUA的一个重要应用。在这个章节里,我们举例说明如何用LUA设置一个程序。让我们用一个简单的例子开始然后展开到更复杂的应用中。首先,让我们想象一下一个简单的配置情节:你的C程序(程序名为PP)有一个窗口界面并且可以让用户指定窗口的初始大小。显然,类似这样简单的应用,有多种解决方法比使用LUA更简单,比如环境变量或者存有变量值的文件。但,即使是用一个简转载 2008-03-15 16:00:00 · 624 阅读 · 0 评论 -
第28章 User-Defined Types in C
第28章 User-Defined Types in C在面的一章,我们讨论了如何使用C函数扩展Lua的功能,现在我们讨论如何使用C中新创建的类型来扩展Lua。我们从一个小例子开始,本章后续部分将以这个小例子为基础逐步加入metamethods等其他内容来介绍如何使用C中新类型扩展Lua。我们的例子涉及的类型非常简单,数字数组。这个例子的目的在于将目光集中到API问题上,所以不涉及复杂转载 2008-03-15 16:02:00 · 656 阅读 · 0 评论 -
第29章 资源管理
第29章 资源管理在前面一章介绍的数组实现方法,我们不必担心如何管理资源,只需要分配内存。每一个表示数组的userdatum都有自己的内存,这个内存由Lua管理。当数组变为垃圾(也就是说,当程序不需要)的时候,Lua会自动收集并释放内存。生活总是不那么如意。有时候,一个对象除了需要物理内存以外,还需要文件描述符、窗口句柄等类似的资源。(通常这些资源也是内存,但由系统的其他部分来管理)。转载 2008-03-15 16:03:00 · 663 阅读 · 0 评论 -
第1章 起点
第1章 起点写一个最最简单的程序——Hello World。print("Hello World")假定你把上面这句保存在hello.lua文件中,你在命令行只需要:prompt> lua hello.lua看到结果了吗?让我们来看一个稍微复杂点的例子:-- defines a factorial functionfunction fact (n转载 2008-03-15 15:46:00 · 465 阅读 · 0 评论 -
第2章 类型和值
第2章 类型和值Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。函数type可以测试给定变量或者值的类型。print(type("Hello world")) --> stringprint(type(10.4*3))转载 2008-03-15 15:46:00 · 465 阅读 · 0 评论 -
第3章 表达式
第3章 表达式Lua中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。还可以是非传统的函数定义和表构造。3.1 算术运算符二元运算符:+ - * / ^ (加减乘除幂)一元运算符:- (负值)这些运算符的操作数都是实数。3.2 关系运算符 = == ~=这些操作符返回结果为false或者true;==和~转载 2008-03-15 15:47:00 · 418 阅读 · 0 评论 -
第四篇 附录
第四篇 附录 A. 终端机控制符在几十年前,流行的是各种终端机(terminal),它们都遵守ANSI X3.64控制字符序列标准(还有一些公司比如IBM、DEC、HP制定了自己的扩展标准),这些控制字符序列能帮助终端对显示的内容作一些处理,比如光标定位,字符色彩,背景色,窗口等等。随着PC的流行,终端机被淘汰,但是原先的终端显示方式以及这些控制字符序列转载 2008-03-15 16:03:00 · 607 阅读 · 0 评论