2009-09-13 7 views
2

Lua имеет очень приятный не скобка синтаксис вызова, который в сочетании с функцией замыкания позволяют мне написать следующуюLua Затворы в реализации DSL

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 (таблица в этом случае)?

ответ

3

От Programming in Lua:

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

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

+1

Благодарим вас за это объяснение. Я был так близок к полноценному DSL ... – jameszhao00

+0

Есть ли причина, по которой вы не могли запустить вход в DSL через какой-то «препроцессор», чтобы поместить круглые скобки вокруг всего? –

+0

Я нашел metalua. Он делает то, что вы описываете. – jameszhao00