lua:函数与Closure
在lua中,函数是一种“第一类值,它们具有特定的词法域。
第一类值:lua当中函数是一个值,他可以存在变量中(无论全局变量还是局部变量)或table中,可以作为函数参数,可以作为返回值。
词法域:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量。这也意味着lua完全可以包含“λ演算(Lambda Calculus)”
在lua中,函数可以看作一个“值”,由一些表达式创建的。
foo = function (x) return 2*x end
举个例子:
network = { {name = "grauna", IP = "210.26.30.34"} {name = "arraial", IP = "210.26.30.23"} {name = "lua", IP = "210.26.23.12"} {name = "derain", IP = "210.26.23.20"} } table.sort(network, function(a,b) return(a.name>b.name) end)
这种用法叫匿名函数,在语句中显示出了极好的便捷性。
闭包:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
闭包组成:外部函数+外部函数创建的upvalue+内部函数(闭包函数)
Lua中只有closure,函数是闭包一种特殊情况。
尾调用消除
尾调用就是一种类似于gota的函数调用。当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”。
--尾调用 function f(x) return g(x) end --不是尾调用 function f(x) g(x) end
也就是说,当f调用完g之后就再无其他事情可做了。因此在这种情况中,程序就不需要返回那个“尾调用”所在的函数了。所以在“尾调用”之后,程序也不需要保存任何关于该函数的栈信息了。当g返回时,执行控制权可以直接返回到调用f的那个点上。使得在进行“尾调用”时不耗费任何栈空间。将这种实现称为支持“尾调用消除”。