【问题标题】:Lua Closures in implementing a DSL实现 DSL 中的 Lua 闭包
【发布时间】:2010-11-27 22:22:45
【问题描述】:

Lua 有一个非常好的无括号调用语法,再加上函数闭包让我可以编写以下代码

local tag = 1
function test(obj)
    return 
        function(str)
            return 
            function (tbl)
                tbl.objtag = tag
                tbl.objname = str
                return tbl
            end
        end

end
test (tag) "def"
{
}

test tag "def" --error
{
}

但是,如果我删除 (tag) 周围的括号,则会导致编译错误。那么为什么 Lua 允许无括号参数(即“def”)而不是无括号 var(本例中为 table)参数?

【问题讨论】:

    标签: function lua dsl closures parentheses


    【解决方案1】:

    来自Programming in Lua

    如果函数只有一个参数,并且该参数是文字字符串或表构造函数,则括号是可选的:

    我对您上述情况的理解是,tag 是一个局部变量(既不是文字字符串也不是表构造函数),所以test(tag) 总是需要括号。您不需要"def" 周围加上括号,因为test(tag) 返回一个接受单个字符串的函数,并且该函数会立即应用于"def"

    【讨论】:

    • 您是否有任何理由不能通过某种“预处理器”将输入运行到 DSL 以将括号括起来?
    • 这已经在邮件列表中出现了几次。它通常首先想知道为什么不包括文字数字。 IIRC,有一些解析边缘案例,其中一些人的收益不会超过其他人的成本。表 c-tors 和文字字符串的好处非常明显,尤其是在数据描述语言的早期 Lua 用例中。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2012-06-14
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多