Lua4.0 参考手册(一)1-3

说明:
这个文档是 doc 目录里的 manual.html 文件。
原文版权归原做者全部,这篇翻译只是做为学习之用。若是翻译有不当之处,请参考原文。
-------------------如下是正文-------------------
编程语言 Lua4.0 的参考手册
--------------------------------------
1 简介
--------------------------------------
Lua 是一个扩展编程语言,支持通用编程功能与数据描述功能。做为一个强大,轻量级的配置语言,它被设计用来作为别的程序的配置语言。

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

Lua 是自由分发的软件,正常提供没有什么保证,如它的版权声明所述。本文档里描述的这个实现能够从下面的地址获得:

http://www.lua.org/
(原文的地址已通过期,这里给出的是当前的官网地址)

如同其它的参考手册同样,这个文档也很枯燥。一些 Lua 设计背后的决策讨论能够参见下面的论文,它们均可以在官网上找到。
> R. Ierusalimschy, L. H. de Figueiredo, and W. Celes. Lua-an extensible extension language. Software: Practice & Experience 26 #6 (1996) 635--652.
> L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. The design and implementation of a language for extending applications. Proceedings of XXI Brazilian Seminar on Software and Hardware (1994) 273--283.
> L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. Lua: an extensible embedded language. Dr. Dobb's Journal 21 #12 (Dec 1996) 26--33.

--------------------------------------
2 环境和块
--------------------------------------
Lua 中全部的语句都在一个全局环境中执行。这个环境由嵌入程序调用 lua_open 初始化并一直持续到调用 lua_close 结束,或者到嵌入程序结束时结束。若是必要的话,宿主程序员能够创建多个独立的全局环境,并能够在它们之间自由的切换(参见 5.1 节)。

这个全局环境能够用 Lua 代码或者嵌入程序来管理,能够经过 Lua 的实现库 API 函数来读写全局变量。

Lua 中的全局变量不须要声明。全部的变量被认为是全局的除非明确声明为 local (参见 4.4.6 节)。在第一次赋值以前,全局变量的值为 nil(能够修改这个默认值,参见 4.8 节)。一个表(table)保存全部的全局名字和值(表的解释参见 3 节)。

Lua 的执行单元叫作块(chunk) 。简单地说,一个块就是一个按顺序执行的语句序列。每一个语句能够可选的后跟一个分号:

       chunk ::= {stat [`;']}

语句在 4.4 节描述。(上面的符号标记法是通用的扩展的 BNF,{ a } 表示 0 个或多个 a,[ a ] 表示一个可选的 a,{ a } +(加号是右上角标)表示一个或多个 a。完整的语法描述在本文档的最后面。)

一个模块能够保存在一个文件中或者一个宿主程序的字符串中。当执行一个模块,首先它被预编译为虚拟机的字节码,而后它的语句由模拟的虚拟机顺序执行。模块对于全局环境的全部修改是持久的,这些修改在模块结束后依然可见。

块可被预编译为二进制格式并保存在文件中;参见程序 luac。包含块代码的文本文件和它们的二进制预编译字节码形式是等价的。Lua 能够自动检测文件类型并作相应操做。

--------------------------------------
3 类型和标签(Types and Tags)
--------------------------------------
Lua 是动态类型语言。这意味着变量没有类型;只有值有类型。因此,Lua 语言中没有类型定义。全部值含有本身的类型。除了类型,全部值还有一个标签(tag)。

Lua 中有六种基本数据类型:nil, number, string, function, userdata, 和 table。Nil 是值为 nil 的类型,它的主要性质就是和其它值不一样。Number 表示实数(双精浮点型),string 是字符串。Lua 是 8 位的,因此字符串能够包含全部的 8 位字符,包括内部的 0 ('\0')(参见 4.1 节)。type 函数返回描述给定值的类型的字符串(参见 6.1 节)。

Lua 中函数是第一类值(first-class values)。这意味着他们能够存储在变量中,作为参数传递给其余函数或者作为结果返回。Lua 能够调用(和操纵)写在 Lua 或 C 中的函数。这两种函数能够由它们的标签区分:全部的 Lua 函数有相同的标签,全部的 C 函数也有相同的标签,而且不一样于 Lua 函数的标签。tag 函数能够返回给定值的标签(参见 6.1 节)。

userdata 类型容许 Lua 变量保存任意的 C 指针(void*)。它至关于 C 语言中的 void* 型指针,因此在 Lua 中除赋值和相等测试操做之外,没有其它预约义的操做。可是,经过使用标签方法(tag methods),程序员能够为 userdata 值定义操做(参见 4.8 节)。

table 类型实现为关联数组,即数组不只能够用数字索引,也能够用任意值索引(除了 nil)。所以,该类型不只可用于表示普通数组,也能够用于表示符号表,集合,记录等。表是 Lua 中主要的数据类型。为表示一个记录,Lua 使用字段名为下标。语言经过提供 a.name 这种表示做为 a["name"] 的语法糖。表也能够包含方法。由于函数是第一类的,表字段能够包含函数。t:f(x) 形式是 t.f(t,x) 的语法糖,它调用表 t 中的方法 f ,并把它本身作为第一个参数传入(参见 4.5.9 节)。

注意 table 是对象而非值。变量不能包含 table,只能引用它。赋值,参数传递,返回老是会操做 table 的引用,而不会对 table 进行拷贝。并且,table 必须在使用前显式建立(参见 4.5.7 节)。

每个类型 nil, number, 和 string 有不一样的标签。全部这些类型的值有一样的预约义标签。正如上面解释的同样,类型 function 的值能够有两个不一样的标签,根据它们是 Lua 函数或者 C 函数。最后,类型 userdata 和 table 能够有程序员指定的可变的标签(参见 4.8 节)。tag 函数返回给定值的标签。用户标签由函数 newtag 生成。settag 函数用来改变表的标签(参见 6.1 节)。userdata 值的标签只能在 C 中设置(参见 5.7 节)。当有事件发生时,标签主要用来选择标签方法(tag methods)。标签方法是扩展 Lua 语义的主要机制(参见 4.8 节)。
(未完待续)html

相关文章
相关标签/搜索