Lua Closures в реализации DSL - PullRequest
       27

Lua Closures в реализации DSL

2 голосов
/ 13 сентября 2009

У 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
{
}

Однако, если я уберу круглые скобки (тег), это приведет к ошибке компиляции. Так почему же Lua допускает параметры без скобок (то есть «def»), а не параметры без скобок var (в данном случае таблица)?

1 Ответ

3 голосов
/ 13 сентября 2009

С Программирование на Lua :

Если функция имеет один единственный аргумент и этот аргумент является либо литеральной строкой, либо конструктором таблицы, то скобки необязательны:

Мое понимание вашей вышеописанной ситуации заключается в том, что тег является локальной переменной (которая не является ни литеральной строкой, ни конструктором таблицы), поэтому test(tag) всегда требует скобок. Вам не нужны круглые скобки вокруг "def", потому что test(tag) возвращает функцию, которая принимает одну строку, и эта функция немедленно применяется к "def".

...