Lua 的执行单元被称作 Chunk,一个 Chunk 是一条语句(赋值、控制结构、函数调用、变量声明)序列,它们会按次序执行。每个语句可以以分号结束:
xxxxxxxxxx
chunk ::= {stat [';']}
语句结尾的分号是可选的,但是如果同一行有多条语句最好使用分号隔开。
Lua 不允许空语句,所以 ';;' 是非法的。(Lua 5.3 开始支持空语句)
Lua 把 Chunk 当作拥有不定参数的匿名函数处理,因此可以在 Chunk 内部定义局部变量、接收参数、返回值。
也可以在 Chunk 内部声明局部函数,该函数仅在 Chunk 内可见,词法定界保证包内其他函数可以调用此类函数。
在 Chunk 内部定义多个 Local Function,并且相互调用(或定义 Local 递归调用函数)时,最好先声明,再定义。
Chunk 可以被保存在文件中,也可以被保存在宿主程序的一个字符串中。 当 Chunk 被执行时,它将被预编译成指令序列, 然后虚拟机解释运行这些指令。
Chunk 也可以被预编译成二进制形式,用源码形式提供的程序和二进制形式的程序可以相互替换。Lua 自动识别文件类型,并做正确的处理。
连接外部 Chunk 的一种方式是使用 dofile
函数,该函数加载文件,并执行它。假设有如下的源文件:
xxxxxxxxxx
-- test.lua
if math.random() >= 0.5 then
return 1
else
return 2
end
在交互模式下,执行:
xxxxxxxxxx
Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> dofile("test.lua")
1
> dofile("test.lua")
2
> dofile("test.lua")
1
>
一个源代码文件;在交互模式中输入的一段代码或一个函数都是 Chunk。
从语法上讲,Block 就是 Chunk:
xxxxxxxxxx
block ::= chunk
语句块可以被显式地写成单独的语句段:
xxxxxxxxxx
stat ::= do block end
显式的语句块对于控制变量的作用范围很有用。 有时显式的语句块被用来在另一个语句块中插入 return 或 break。
函数调用和赋值语句都可能以小括号开头, 这可能让 Lua 的语法产生歧义。 我们来看看下面的代码片断:
a = b + c
(print or io.write)('done')
从语法上说,可能有两种解释方式:
当前的解析器总是用第一种结构来解析, 它将括号看成函数调用的参数传递开始。 为避免这种二义性, 在语句以小括号开头时,前面放一个分号是个好习惯:
xxxxxxxxxx
;(print or io.write)('done')