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

  • 相关阅读:
    Qt学习之路1---软件下载安装及工程简介
    c++之五谷杂粮---3
    c++之五谷杂粮---2
    隐式类型转换
    运算时的数据类型提升
    c++之五谷杂粮---1
    RSYNC--数据迁移、备份
    microsoft .netframework Available Source Code Components
    查看一个文件系统所在的卷组方法
    IE7/8浏览器都不能显示PNG格式图片
  • 原文地址:https://www.cnblogs.com/losophy/p/10651855.html
Copyright © 2011-2022 走看看