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的那个点上。使得在进行“尾调用”时不耗费任何栈空间。将这种实现称为支持“尾调用消除”。

posted @ 2019-04-03 22:00  _raindrop  阅读(282)  评论(0编辑  收藏  举报