基本概念
函数在Lua中属于“带有词法范围的一类值”(first-class values with proper lexical scoping)。
所谓“一类值”(first-class values),应该符合以下条件:
- 可以被保存到变量和数据结构中
- 可以被当作子程序的参数和返回值
- 可以在运行期被创建
- 具有内在一致性,也就是不依赖于任何给定的名称
在Lua中,所有的值都是“一类”值,包括函数本身。函数可以被保存到任何的变量或者table中,可以被当作参数和返回值使用,所有的函数(更准确的说应该是closure)都是运行期被创建的,函数本身并没有名字,名字只是对函数的引用而已。
First-class function为lua带来了很多FP的概念,比如“高阶函数”(Higher-order functions),“匿名函数”(Anonymous functions")。这些功能在很多语言中都是通过特殊的语法来支持的,而在lua中则不需要。
所谓“词法范围”(lexical scoping),
Functions in Lua are first-class values with proper lexical scoping.
first class value
http://en.wikipedia.org/wiki/First-class_citizen
- can be stored in variables and data structures
- can be passed as a parameter to a subroutine
- can be returned as the result of a subroutine
- can be constructed at run-time
- has intrinsic identity (independent of any given name)
lexical scoping
static scoping
在Lua中,lua closure和c closure都使用一个Closure结构体来表示一个closure对象:
typedef struct CClosure {
ClosureHeader;
lua_CFunction f;
TValue upvalue[1]; /* list of upvalues */
} CClosure;
typedef struct LClosure {
ClosureHeader;
struct Proto *p;
UpVal *upvals[1]; /* list of upvalues */
} LClosure;
typedef union Closure {
CClosure c;
LClosure l;
} Closure;
closure代表一个函数的可调用实例。无论时lua closure还是c closure,都包含两部分信息:函数体和upvalue。
Lua closure中的p是对
函数数据类型在lua中使用LUA_TFUNCTION来标识。在内部,LUA_TFUNCTION又被分成三种子类型:LUA_TLCL,LUA_TLCF和LUA_TCCL。
LUA_TLCF代表一个轻量级的C function。所谓的轻量级