(接上篇)
--------------------------------------
6 预定义的函数和库
--------------------------------------
Lua 的一组预定义函数虽少但功能强大。他们中大多数提供的功能让语言有一定程度的自反性。一些功能不能通过语言的其它部分模拟也不能通过标准的 Lua API 模拟。其它的只是一些有用的有用通用 API 函数接口。
库,在另一方面,提供了一种通过标准 API 实现的有用的程序。因此,它们并非语言必需的部分,并且作为单独的 C 模块被提供。
目前,有三个库:
字符串处理
数学函数(sin, cos, 等)
输入输出(和一些系统功能)
为了能使用这些库,宿主程序应该调用函数 strlib_open, mathlib_open, 和 iolib_open,这几个都在 lualib.h 中声明。
-------------------
6.1 预定义函数
-------------------
dofile (filename)
函数接受一个文件名字,打开并执行它的内容做为一个 Lua 模块,或者做为预编译的模块。当无参调用它时,它执行标准输入的内容。它返回 1 如果没有出错,否则返回nil 。如果以非字符串参数调用它时会产生一个错误。
dostring (string)
函数执行一个给定的字符串做为一个 Lua 模块,没有错误返回 1, 否则返回 nil。
next (table, index)
函数允许一个程序枚举一个表的所有字段。它的第一个参数是一个表,第二个参数是表中的索引。它返回表的下一个键值对(索引及和索引关联的值)。当用 nil 做为第二个参数调用它时,函数返回表的第一个健值对。当用最后一个索引调用,或者用 nil 调用一个空表,均返回 nil。
Lua 中没有字段的声明;在语义上,表中一个字段不存在和字段的值为 nil 没有区别。所以,该函数只考虑没有空值的字段。索引的枚举顺序没有规定,就算是数字索引的也没有规定。
8.2 节有一个使用这个函数的例子。
nextvar (name)
函数和 next 函数类似,但它在全局变量上遍历。它的参数是全局变量的名字,或者是 nil (可以获得第一个名字)。和 next 类似,它返回另一个变量的名字和值。或者是 nil 如果没有更多的变量了(遍历结束了)。
8.2 节 有一个使用这个函数的例子。
tostring (e)
函数可以接受一个任何类型的值作为参数,并以一个合理的格式把它转化为字符串。
print (e1, e2, ...)
函数可以接受任意数量的参数,以一种合理的格式打印它们的值。每一个值都在一个新行上打印。这个函数不是为了格式化输出,只是为了以一种快速的方法显示一个值,例如打印一个出错信息或者调试。参见 6.4 节一个格式化输出函数。
tonumber (e)
函数接受一个参数,尝试把它转化为一个数字。如果参数已经是一个数字或者是一个可以转化为数字的字符串(参见 4.2 节),它返回那个数字;否则,返回 nil。
type (v)
函数允许 Lua 测试一个值的类型。它接受一个参数,返回它的类型,以一个字符串表示。这个函数可能的返回值是:
“nil” (一个字符串,不是 nil 值),“number”, “string”,“table”, “function"(C 函数和 Lua 函数都返回它) 和 "userdata"。
和这个字符串一起,函数还返回第二个结果,就是值的标签(tag)。这个标签可以用来区分不同标签的用户数据(user data),或者是 C 函数和 Lua 函数。
assert(v)
当它的参数为 nil 时,产生一个错误断言("assertion failed!")。
error(message)
这个函数产生一个出错信息并且终止库中最后调用的函数(lua_dofile, lua_dostring)。它从不返回。
setglobal(name, value)
这个函数把给定的值赋给一个全局变量。字符串名字并不需要是一个合乎语法的变量名。所以,这个函数可以设置全局变量用奇怪的名字如 m v 1 或者 34. 它返回第二个参数的值。
getglobal(name)
这个函数返回全局变量的值。字符串名字不必是一个合乎语法的变量名。
setfallback (fallbackname, newfallback)
函数用给定的回退函数设置一个新的回退函数。它返回老的回退函数。
-------------------
6.2 字符串处理
-------------------
这个库提供字符串处理的通用函数,如查找和提取子串。索引一个字符串的时候,第一个字符的索引是 1。8.3 节有一些字符串处理的例子。
strfind (str, substr, [init, [end]])
接受两个字符串参数,返回一个数字。这个数字标明第二个参数在第一个参数中第一次出现的位置。如果第二个参数不是第一个参数的子串,返回 nil。第三个可选的数值参数指定检索开始位置。另一个可选的参数设置检索结束位置。
strlen (s)
接受一个字符串返回它的长度。
strsub (s, i, [j])
返回另一个字符串,它是 s 的子串,始于 i 终于 j 。 如果 j 不指定,它被假定为 s 的长度。特别的,strsub(s,1,j) 调用返回 s 的 j 个字符的前缀,strsub(s,i) 返回 s 的始于 i 的后缀。
strlower (s)
接受一个字符串,返回它的所有大写字母都转化为小写的拷贝。其它的字符保持不变。
strupper (s)
接受一个字符串,返回它的所有小写字母都转化为大写的拷贝。其它的字符保持不变。
ascii (s, [i])
返回字符 s[i] 的 ascii 码,如果 i 不指定,就假定它是1。
format(formatstring, e1, e2, ...)
函数返回一个可变参数的格式化字符串,格式由第一个参数描述(它必须是一个字符串)。格式字符串和标准 C 函数的 printf 族的规则一样。唯一不同的是选项 *,l,L,n,p, 和 h 不支持,并且它还有一个额外的选择 q 。这个选项以一个合适的格式格式化一个字符串,可以被 Lua 解释器安全的读回。写在双引号中的字符串,和所有的双引号,换行和反斜线都可以在写出时被正确的转义。
选项 c,d,E,e,f,g,i,o,u,X 和 x 都需要一个数值参数,q 和 s 需要一个字符串。
-------------------
6.3 数学函数
-------------------
这个库是到一些标准 C 数学函数库函数的一个接口。而且,它为二元幂操作符 ^ 注册了一个回退函数,当它应用于 x^y时,返回 x的 y次幂。
它提供了以下的函数:
abs acos asin atan atan2 ceil cos floor log log10
max min mod sin sqrt tan random randomseed
它们中的绝大部分只是 C 函数库中同名函数的接口,不同之处是,在三角函数中,所有的角度被转化为弧度。
max 返回数字参数列表中的最大值,类似的,min 返回最小值。它们的参数个数都是任意的。
mode 和 C 语言中的 % 操作符是等价的。
函数 random 和 randomseed 是到 ANSI C 提供的随机数生成器函数 rand 和 srand 的接口。函数 random 返回在 [0,1) 区间的伪随机数。
-------------------
6.4 I/O
-------------------
Lua 中所有的 I/O 操作都是基于两个当前文件,一个是为了读,一个是为了写。当前的输入输出文件的初始值分别是 stdin, stdout。
除非特别规定,所有的 I/O 函数功能时返回 1 失败时返回 nil。
readfrom (filename)
函数打开一个名为 filename 的文件并且把它设置为当前的输入文件。当无参调用它时,这个函数关闭当前的输入文件,并把当前的输入文件恢复为 stdin。
系统依赖:如果文件名由竖线 | 开始,会用函数 popen 打开一个输入管道。
writeto (filename)
函数打开一个名为 filename 的文件并且把它设置为当前的输出文件。注意,如果这个文件是已经存在,调用这个操作会清除它。当无参调用它时,这个函数关闭当前的输出文件,并把当前的输出文件恢复为 stdout。
系统依赖:如果文件名由竖线 | 开始,会用函数 popen 打开一个输出管道。
appendto (filename)
函数打开一个名为 filename 的文件并且把它设置为当前的输出文件。不像 writeto 操作,这个函数不会清除文件之前的内容。
remove (filename)
函数删除给定名字的文件。
rename(name1, name2)
函数把文件名从 name1 改为 name2。
tmpname()
函数返回一个安全可用的临时文件名。
read ([format])
函数返回从当前输入读取的值。一个可选的字符串参数指定输入的解释方式。
如果没有格式化参数,read 首先跳过空白,制表符,换行符。然后它检查当前的字符是否是单引号或双引号(”,’)。如果是,它读取一个字符串直到字符串结束标志,并且返回这个字符串,不带字符串的标志符。否则,它读取直到另一个空白,制表符,或换行符。
格式化字符串可以是以下的形式:
?[n]
? 可以是:
‘s‘ 或者 ‘S‘ 读一个字符串;
‘f‘ 或者 ‘F‘ 读一个实数;
‘i‘ 或者 ‘I‘ 读一个整数。
可选的 n 是一个数字指示为了构成输入而必须读取多少个字符。特别地,格式 "s1" 读取单个字符。
readuntil (char)
从当前输入读取直到给定字符首次出现。当无参调用时,读取当前输入直到结束。返回读取的字符串。字符本身并不读取。
write (value, [format])
函数写第一个参数的值到当前输出。可选的第二个参数指示使用的格式。这个格式作为一个字符串给出,由四部分组成。第一个部分是必不少的,它必须是下面的几个字符之一:
‘s‘ 或者 ‘S‘ 写字符串;
‘f‘ 或者 ‘F‘ 写浮点数;
‘i‘ 或者 ‘I‘ 写整数。
‘q‘ 或者 ‘Q‘ 写引用的字符串。这个格式以一种 Lua 解释器可以安全读回的格式写字符串。双引号中的字符串会被写,及所有字符串中的双引号,换行和反斜线在写的时候都会被正确的转义。
这些字符可以后接:
[?][m][.n]
? 指示字段的对齐方式
‘<‘ 右对齐(默认)
‘>‘ 左对齐
‘|‘ 居中对齐
m 指示字符的大小
.n 对于实数,指示小数点的位数。对于整数,它是最小位数。对于字符串此位无意义。
当这个函数调用没有给出格式字符串时,这个函数写数字使用 %g 格式,写字符串使用 %s 。可以用函数 format (参见 6.2 节)以取得更好的格式化。
date ([format])
这个函数返回一个包含日期和时间的字符串,以给定的字符格式 format, 同 ANSI C 的函数 strftime 有相同的规则。当无参调用时,它会返回一个合理的日期和时间展示。
这个函数取代 Lua 之前版本中的 date 和 time 函数。
exit([code])
函数调用 C 函数 exit, 以一个可选的退出码,用来终止程序。
(未完待续)