1.开始

第一个程序我们按照惯例写一个打印"Hello World"

print("Hello World!")

写入文件hello.lua中,在cmd(Windows环境)使用以下命令运行:

prompt> lua hello.lua

下面是一个稍微复杂的示例,定义了一个函数来计算给定数字的阶乘,要求用户提供一个数字,并打印其阶乘:

-- defines a factorial(阶乘) function

function fact(n)

if n == 0 then

return 1

else

return n * fact(n - 1)

end

end

print("For calculate factorial n, Enter a number:")

a = io.read("*number")

print("The calculation result is " .. fact(a))

1.1 Chunk 块

在Lua中,每段代码,比如一个文件或者交互模式中的单行代码,都被称为一个“chunk”(块)。更具体地说,一个chunk是一系列语句。

在任何语句之后都可以选择性地加上分号。通常,在同一行上写两个或更多语句时使用分号,但这只是一种约定,换行对Lua的语法没有影响。例如,以下四个chunks都是有效的且等价的:

a = 1

b = a * 2

a = 1;

b = a * 2;

a = 1; b = a * 2

a = 1 b = a * 2 --ugly, but valid

一个chunk可以是一个简单的语句,比如“Hello World”示例中的一个语句,也可以由一系列语句和函数定义(实际上是赋值,后面会讨论)组成,比如阶乘的例子。

一个chunk的大小可以随你的需要而定。由于Lua也用作数据描述语言,包含几兆字节的chunk并不罕见。Lua解释器对于大尺寸的chunk没有任何问题。

你可以选择将程序写入文件,也可以在交互模式下运行独立的解释器。如果你调用Lua而没有任何参数,你将获得其提示符:

Lua 5.0 Copyright (C) 1994-2003 Tecgraf, PUC-Rio

>

之后,你在按下后输入的每个命令(如 print “Hello World”)都会立即执行。要退出交互模式和解释器,只需键入文件结束符(Unix中为ctrl-D,在DOS/Windows中为ctrl-Z),或调用操作系统库的 exit 函数(你需要输入 os.exit())。

在交互模式下,Lua通常将你输入的每一行解释为一个完整的chunk。但是,如果它检测到一行无法形成一个完整的chunk,它将等待更多的输入,直到形成一个完整的chunk。当Lua正在等待行的继续时,它会显示一个不同的提示符(通常是 >>)。因此,你可以直接在交互模式中输入多行定义,比如阶乘函数。然而,有时将这样的定义放在一个文件中,然后调用Lua运行该文件会更方便。

可以通过使用选项将所有块作为参数提供给独立解释器来执行块序列 -l 。例如,如果您有一个文件 a 包含单个语句 x=1 和另一个文件 b 包含单个语句 print(x),则命令行:

prompt> lua -la -lb

这将运行文件 a 中的代码块,然后运行文件 b 中的代码块,其中的 print(x) 将输出预期的结果 1。

需要注意的是,-l 选项实际上调用了 require 函数,该函数在特定路径查找文件。因此,如果这个路径不包括当前目录,上述示例可能无法正常运行。

你还可以使用 -i 选项,在运行给定的代码块后,指示 Lua 启动交互式会话。例如,下面的命令行:

prompt> lua -i -la -lb

将运行文件 a 中的代码块,然后运行文件 b 中的代码块,最后提示你进行交互。这对于调试和手动测试特别有用。

通过使用 dofile 函数,你可以立即执行一个文件中的Lua代码块。例如,你可能有一个名为 lib1.lua 的文件,其中包含以下内容:

-- 文件 'lib1.lua'

function norm(x, y)

local n2 = x^2 + y^2

return math.sqrt(n2)

end

function twice(x)

return 2*x

end

进入交互模式:

lua -i lib1.lua

然后,在交互模式中,可以输入:

> dofile("lib1.lua") -- 加载你的库

> n = norm(3.4, 1.0)

> print(twice(n)) --> 7.0880180586677

local n2 = x^2 + y^2:在函数内部声明了一个局部变量 n2,并计算了 x 和 y 的平方和。

return math.sqrt(n2):使用 math.sqrt 函数计算 n2 的平方根,并将结果作为函数的返回值。

这个函数实际上计算了二维平面上点 (x, y) 到原点 (0, 0) 的欧几里德距离,即点到原点的直线距离。

dofile 函数在测试代码片段时非常有用。你可以使用两个窗口:一个窗口是文本编辑器,打开着你的程序(比如在文件 prog.lua 中),另一个窗口是运行 Lua 交互模式的控制台。在保存对程序的修改后,你可以在Lua控制台中执行 dofile(“prog.lua”) 来加载新的代码,然后你可以测试新的代码,调用其中的函数并打印结果。这种方式有助于在交互模式中不断调试和测试你的代码。

1.2 Global Variables 全局变量

在Lua中,全局变量无需声明,只需为其赋值即可创建。访问一个未初始化的变量不会产生错误;你只会得到一个特殊的值 ——nil

print(b) --> nil

b = 10

print(b) --> 10

通常情况下,你不需要删除全局变量;如果你的变量寿命较短,应该使用局部变量。但是,如果你需要删除一个全局变量,只需将其赋值为 nil:

b = nil

print(b) --> nil

之后,就好像这个变量从未被使用过一样。换句话说,一个全局变量存在(且只存在)当且仅当它具有非nil的值。

1.3 Some Lexical Conventions 词法约定

1.标识符(Identifiers):

Lua中的标识符可以是任何由字母、数字和下划线组成的字符串,但不能以数字开头。 例如:i、j、i10、_ij、aSomewhatLongName、_INPUT。

避免使用下划线后跟一个或多个大写字母的标识符(例如 _VERSION),因为它们在Lua中保留供特殊用途使用。通常,将标识符 _(一个下划线)保留为虚拟变量的惯例。

2.本地化依赖的标识符:

Lua中字母的概念是本地化依赖的。因此,在适当的区域设置下,你可以使用变量名,比如 índice 或 ação。但是,这样的名称可能使你的程序无法在不支持该区域设置的系统上运行。

3.保留字:

以下单词是保留字,不能用作标识符:and、break、do、else、elseif、end、false、for、function、if、in、local、nil、not、or、repeat、return、then、true、until、while。

4.大小写敏感:

Lua是区分大小写的。例如,and 是一个保留字,而 And 和 AND 是两个不同的标识符。

5.注释:

注释可以使用双连字符(–)开始,直到行末。例如:-- This is a comment. Lua还支持块注释,以 --[[ 开始,直到相应的 ]]。例如:

--[[

This is a block comment.

It can span multiple lines.

--]]

注释掉一块代码的常见技巧是使用 --[[]],如下:

--[[

print(10) -- no action (comment)

--]]

现在,如果在第一行添加一个单连字符,代码就会生效:

---[[

print(10) --> 10

--]]

在第一个示例中,最后一行的 – 仍然在块注释内。在第二个示例中,序列 —[[ 不会开始块注释,所以 print 在注释之外。在这种情况下,最后一行成为独立的注释,因为它以 – 开头。

1.4 The Stand-Alone Interpreter Lua的独立解释器

Lua独立解释器是Lua编程语言的一个独立执行环境,它允许直接运行Lua脚本或在交互模式中与Lua进行交互。这个独立解释器的可执行文件通常被称为 lua 或 lua.c(源文件的名称),并且它是Lua语言的一个标准组件。

什么是解释器加载文件?

"解释器加载文件"指的是Lua解释器执行一个包含Lua代码的文件。当你运行Lua解释器并提供一个文件名作为参数时,解释器会打开并执行该文件中的Lua代码。

在Lua脚本中,你可以将一系列Lua语句保存在文件中,然后通过Lua解释器来运行这个文件。这样的文件通常被称为Lua脚本或Lua源文件。当解释器加载文件时,它会按照文件中的顺序执行其中的Lua语句。

例如,假设有一个名为 myscript.lua 的文件,其中包含以下Lua代码:

-- 文件 'myscript.lua'

print("Hello from Lua!")

x = 10

y = 20

print("Sum:", x + y)

你可以在命令行中使用Lua解释器运行这个文件:

lua myscript.lua

解释器将打开 myscript.lua 文件,按照文件中的顺序执行每一行代码,并输出结果到控制台。在这个例子中,执行结果可能如下所示:

Hello from Lua!

Sum: 30

1. 解释器的加载文件行为:

当解释器加载一个文件时,如果文件的第一行以井号 (#) 开头,则会忽略这一行。这个特性允许在Unix系统中将Lua用作脚本解释器。例如,如果你的程序以以下形式开始:

#!/usr/local/bin/lua

#!/usr/bin/env lua

那么你可以直接调用程序,而不必显式调用Lua解释器。直接调用程序而不必显式调用Lua解释器是指通过在Lua脚本文件的第一行添加特定的 shebang(hashbang)行,使得操作系统能够自动识别并调用正确的解释器,而无需用户手动指定Lua解释器的路径。

这样,当用户直接运行Lua脚本文件时,操作系统会自动调用相应的Lua解释器,而无需在命令行中显式指定解释器的路径。这就实现了"直接调用程序而不必显式调用Lua解释器"的效果。

2. 解释器的使用:

lua [options] [script [args]]是解释器的使用方式。一切都是可选的。当没有参数调用lua时,解释器进入交互模式。

以下是一些常见的Lua解释器命令行选项: ① -e “chunk” or – “chunk”

在命令行中执行Lua代码片段

lua -e "print('Hello, Lua!')"

② -l name or --require name

加载Lua库

lua -l mathlib myscript.lua

③ -i or --interactive

运行完其他参数后进入交互模式。

lua -i myscript.lua

④ -v or --version

显示Lua解释器的版本信息

lua -v

⑤ -h or --help

显示命令行选项的帮助信息

lua -h

⑥ -E

禁用环境变量 LUA_INIT

lua -E myscript.lua

⑦ -W or --pause

在退出之前等待用户按下回车键

lua -W myscript.lua

3. -e 选项:

-e 选项允许在命令行中直接输入代码。例如:

prompt> lua -e "print(math.sin(12))" --> -0.53657291800043

在Unix系统中需要双引号来阻止shell解释括号。

4. -l 选项和 -i 选项:

-l 选项加载一个文件,-i 选项在运行其他参数后进入交互模式。例如:

prompt> lua -i -l a.lua -e "x = 10"

这将加载文件 a.lua,然后执行赋值 x = 10,最后进入交互模式。

5. 自定义交互模式的提示符:

如果全局变量 _PROMPT 被定义,Lua会使用它的值作为交互时的提示符。可以通过以下调用更改提示符:

prompt> lua -i -e "_PROMPT=' lua> '"

lua>

6. LUA_INIT 环境变量:

在运行参数之前,Lua在启动时查找一个名为 LUA_INIT 的环境变量。如果存在并且其内容是 @filename,那么Lua加载给定的文件。如果 LUA_INIT 被定义但不以 @ 开头,那么Lua假设它包含Lua代码并运行它。

这个变量为配置独立解释器提供了很大的灵活性,因为你可以在配置中完全使用Lua的所有功能。你可以预加载包,更改提示符和路径,定义自己的函数,重命名或删除函数等等。

7. 命令行参数的获取:

主脚本可以通过全局变量 arg 获取命令行参数。在类似以下的调用中:

prompt> lua script a b c

Lua在运行脚本之前会创建一个名为 arg 的表,其中包含所有命令行参数。脚本名放入索引 0;它的第一个参数(在例子中是 a)放入索引 1,以此类推。出现在脚本之前则以负索引的形式存在。例如,在以下调用中:

prompt> lua -e "sin=math.sin" script a b

Lua收集的参数如下:

arg[-3] = "lua"

arg[-2] = "-e"

arg[-1] = "sin=math.sin"

arg[0] = "script"

arg[1] = "a"

arg[2] = "b"

大多数情况下,脚本只使用正索引(例如在例子中的 arg[1] 和 arg[2])。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: