lua系列-2-Chunk

Chunk(代码块)

Lua的一个执行单元被称作Chunk,一个Chunk就是一个语句(赋值、控制结构、函数调用、变量声明)序列,它们会按次序执行。每个语句可以以一个分号结束:
chunk ::= {stat [';']}
(语句结尾的分号是可选的,但是如果同一行有多个语句最好使用分号隔开。)
Lua中不允许有空的语句,所以 ';;' 是非法的。(lua5.3支持空语句
Lua把Chunk当作拥有不定参数的匿名函数处理,正是这样可以在Chunk内部定义局部变量、接收参数、返回值。
也可以在Chunk内部声明局部函数,该函数仅在Chunk内可见,并且词法定界保证了包内其他函数可以调用此函数。
在chunk内部定义多个local function并且相互调用(或定义local递归调用函数)时,最好先声明,再定义。
Chunk可以被保存在一个文件中,也可以保存在宿主程序的一个字符串中。 当一个 chunk 被执行,首先它会被预编译成虚拟机中的指令序列, 然后被虚拟机解释运行这些指令。
chunk 也可以被预编译成二进制形式;用源码形式提供的程序和被编译过的二进制形式的程序是可以相互替换的; Lua 会自动识别文件类型并做正确的处理。
一种连接外部Chunk的方式是使用dofile函数,dofile函数加载文件并执行它,假设有一个文件:

-- test.lua
if math.random() >= 0.5 then  
    return 1
else  
    return 2
end  

在交互模式下:

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(语句块)

从语法上讲,一个block就是一个chunk:
block ::= chunk
一个语句块可以被显式的写成一个单独的语句段:
stat ::= do block end
显式的语句块对于控制变量的作用范围很有用。 有时候,显式的语句块被用来在另一个语句块中插入 return 或是 break。

函数调用和赋值语句都可能以一个小括号打头, 这可能让 Lua 的语法产生歧义。 我们来看看下面的代码片断:

     a = b + c
     (print or io.write)('done')
从语法上说,可能有两种解释方式:

     a = b + c(print or io.write)('done')

     a = b + c; (print or io.write)('done')
当前的解析器总是用第一种结构来解析, 它会将开括号看成函数调用的参数传递开始处。 为了避免这种二义性, 在一条语句以小括号开头时,前面放一个分号是个好习惯:

     ;(print or io.write)('done')

参考文档

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: