首页 > 代码库 > Lua2.4 参考手册(一)

Lua2.4 参考手册(一)

说明:
这个文档是 Lua2.4 的 doc 目录里的 refman.ps 文件。
原文版权归原作者所有,这篇翻译只是作为学习之用。如果翻译有不当之处,请参考原文。
-------------------以下是正文-------------------
编程语言 Lua2.4 的参考手册

摘要:Lua 是一个扩展程序语言,被设计用做其它程序的配置语言。本文档描述 Lua 编程语言 2.4 版,以及 Lua 程序和宿主 C 程序交互的 API。它还提供了一些使用这些主要特点的例子。

--------------------------------------
1 简介
--------------------------------------
Lua 是一个扩展编程语言,支持通用编程功能与数据描述功能。它应该做为别的程序的配置语言使用。Lua 是由 R. Ierusalimschy, L. H. de Figueiredo 和 W. Celes 设计, 由 W. Celes 实现。

Lua 被实现为由 C 语言写成的库。做为一个扩展语言,Lua 没有 "main" 函数的概念;它只能嵌入到宿主运行,叫做嵌入程序。宿主可以执行一段 Lua 代码,可以读写 Lua 变量,可以注册被 Lua 代码调用的 C 函数。通过注册 C 函数,Lua 可以扩展自己以应对不同的领域,从而创建可定制、共享语法框架的编程语言。

Lua 是自由分发的软件,正常提供没有什么保证。本文档里描述的这个实现可以从下面的匿名 ftp 得到:

www.lua.org/ftp/lua-2.4.tar.gz

--------------------------------------
2 环境和模块
--------------------------------------
Lua 中所有的语句都在一个全局环境中执行。这个全局环境持有所有的全局变量和函数,在嵌入语言一开始执行时进行初始化,并持续到结束。

这个全局环境可以用 Lua 代码或者嵌入程序来管理,可以通过 Lua 的实现库来读写全局变量。

全局变量不需要声明。所有的变量被认为是全局的除非明确声明为 local (详见 4.4.5 节,local 的声明)。在第一次赋值之前,全局变量的值为 nil。

Lua 的执行单元叫做模块(module) 。module 的语法为(注一):

 module --> { statement | function }

一个模块可以包含语句和/或函数定义,可以在一个文件中或者在一个宿主程序的字符串中。当执行一个模块,首先它所有的函数和语句被编译,然后语句按顺序执行。模块对于全局环境的所有修改是持久的,这些修改在模块结束后依然可见。修改包括全局变量的修改和新函数的定义(注二)

模块可被预编译,详见程序 luac。包含模块代码的文本文件和它们的二进制预编译字节码形式是等价的。Lua 可以自动检测文件类型并做相应操作。

注一:照倒,{ a } 表示 0 个或多个 a,[ a ] 表示一个可选的 a,{ a } +(加号是右上角标)表示一个或多个 a。
注二:实际上,一个函数的定义就是给一个全局变量赋值。(详见第 3 节)。

--------------------------------------
3 类型
--------------------------------------
Lua 是动态类型语言。变量没有类型;只有值有类型。所有值含有自己的类型。所有,Lua 语言中没有类型定义。

Lua 中有七种基本数据类型:nil, number, string, function, Cfunction, userdata, 和 table。Nil 是值为 nil 的类型,它的主要性质就是和其它值不同。Number 表示实数(浮点型),string 是字符串。

函数是第一类值(first-class values)。这意味着他们可以存储在变量中,做为参数传递给其他函数或者做为结果返回。当函数被定义,它的函数体被编译并保存在一个给定名称的全局变量。Lua 可以调用(和操作)写在 Lua 或 C 中的函数;后者的类型是 Cfunction。

userdata 类型允许 Lua 变量保存任意的 C 指针(void*)。它相当于 C 语言中的 void* 型指针,所以在 Lua 中除分配和相等测试操作以外,没有其它预定义的操作。但是,通过使用回退(fallback),程序员可以为 userdata 值定义操作,参见 4.7 节。

table 类型实现为关联数组,即数组不仅可以用数字和字符串索引,也可以用任务值索引(除了 nil)。因此,该类型不仅可用于表示普通数组,也可以用于表示符号表,集合,记录等。为表示一个记录,Lua 使用字段名为下标。语言通过提供 a.name 这种表示作为 a["name"] 的语法糖。表也可以包含方法。因为函数是第一类的,表字段可以包含函数。t:f(x) 形式是 t.f(t,x) 的语法糖,它调用表 t 中的方法 f ,并把它自己做为第一个参数传入。

需要特别注意的是 table 是对象而非值。变量不能包含 table,只能引用它。赋值,参数传递,返回总是会操作 table 的引用,而不会对 table 进行拷贝。而且,table 必须在使用前显式创建。参见 4.5.7 节。
(未完待续)

Lua2.4 参考手册(一)