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

  • 相关阅读:
    转:Omnet++ 4.0 installation for Ubuntu
    转:myeclipse假死的解决方案
    omnet++ 4.0下使用XML的例子
    转:Microsoft JET Database Engine (0x80004005) 未指定的错误的完美解决
    C# 数据库删除操作错误报错 System.Data.SqlClient.SqlException (0x80131904)
    Windows 7 转移用户文件夹
    CentOS自动登录Gnome
    Archlinux GRUB2 配置
    Archlinux 登录管理器切换
    html2chm工具1.0发布
  • 原文地址:https://www.cnblogs.com/losophy/p/10651855.html
Copyright © 2011-2022 走看看