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

  • 相关阅读:
    CentOS6.2编译安装Nginx1.2.0
    mysql之主从复制篇
    CentOS6.2编译安装PHP5.4.0
    c# 多线程 编程
    QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案
    C# 动态编译、动态执行、动态调试
    在Visual C#中用ListView显示数据记录
    推荐一个免费的HTTP抓包分析工具 Fiddler Web Debugger
    C#简繁体转换方法(Microsoft.Office.Interop.Word)
    C#读取字符串类型XML
  • 原文地址:https://www.cnblogs.com/losophy/p/10651855.html
Copyright © 2011-2022 走看看