这节描述语言的基本概念
lua是一个dynamically typed language. 也就是说变量没有类型,只有值,语言中没有类型定义,所有的值都携带它们自己的类型。
所有的值都是first-class值,意味着所有的值可以存储到变量,作为参数传递给其它函数,返回为值。
LUA有8个基本类型:nil, boolean, numer, string, function, userdata, thread, table。
nil只有一个值nil。boolean有两个值,false和true。
nil和false使条件为假,任何其它值使条件为真。
string表示字节序列。字符串可以包含任何8位序列,甚至'\0'
number内部有两种subtype,一种是integer,一种是float。标准LUA使用64位整数,双精度浮点数。但是编译时可以指定32位整数和单精度浮点数。
LUA可以调用LUA写的函数,和C写的函数。这两种类型都是function。
userdata允许任何c数据存储到LUA变量中。有两种userdata,full userdata,object的整个数据块由LUA管理,还有一个light userdata,只是存储一个C指针。
thread类型是独立的执行线程。
table是关联数组。任何值除了nil和NaN都可以做下标。除了nil,任何类型都可以作为值,如果一个key的value为nil,那么这个key不认为是table的一部分。相对的,任何不是table一部分的key的值都是nil。
a[i]和a[j]是同一个表元素,当且仅当i和j是raw equal的情况下。除了一种情况,为整数值的浮点数和对应的整数。 如a[1.0]和a[1]是同一个整数。
table, function, threads, (full) userdata是objects。变量不包含这些值,仅仅是包含它们的引用。赋值、参数传递、函数返回只是维护这些值的引用,这些操作不会做实际的拷贝。
库函数type,返回描述给定值的类型的字符串。
任何free name (没有绑定到任何声明)var,都被翻译为_ENV.var。
每个chunk都被编译为一个叫做_ENV的external local variable的范围内。_ENV不是一个free name。
但是_ENV是一个regular name,可以用来定义变量和参数。
任何作为_ENV的值的table都被叫做environment。
还有一个global environment,全局变量_G的值,被初始话为全局环境的值。
当LUA加载一个chunk时,_ENV的缺省值被更新为global environment。
所有的标准库被载入到global environment。
可以使用load来加载一个有不同环境的chunk。
LUA中的每一个值都有一个metatable。metatable是一个普通的Lua table,
例如一个非数字值作为加法的操作数,Lua检查这个值的metatable是否有一个_add key,其值是一个function类型。Lua调用这个函数做加法。
metatable的key是一个字符串,以两个下划线开始,其值叫做metamethods。如__add。
使用getmetatable获取一个变量的metatable
使用rawget获取metamethods
rawget(getmetatable(o) or {}, "__ev")
使用setmetable函数设置metatable,但是只能在C API函数中设置。
Tables和full userdata有独立的metatables
所有其它类型的值每个类型共享一个metatable。
lua自动执行内存管理。
Lua支持coroutines,被叫做collaborative multithreading。
只有显示执行yield函数,才会挂起它自己的执行。