2009-09-13 4 views
2

Lua a pas parenthèse syntaxe d'appel vraiment bien que couplé avec des fermetures fonction me permettent d'écrire les éléments suivantsClosures Lua dans la mise en œuvre d'un 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 
{ 
} 

Cependant, si je retire la parenthèse autour (tag), il entraîne une erreur de compilation. Alors pourquoi Lua autorise-t-il les paramètres no-parenthèses (c'est-à-dire "def") et non les paramètres no-parenthesis var (table dans ce cas)?

Répondre

3

De Programming in Lua:

Si la fonction a un seul argument et cet argument est soit une chaîne littérale ou un constructeur de table, les parenthèses sont facultatives:

Ma compréhension de votre ci-dessus La situation est que tag est une variable locale (qui n'est ni une chaîne littérale ni un constructeur de table), donc test(tag) requiert toujours des parenthèses. Vous besoin pas de parenthèses autour de "def" car test(tag) renvoie une fonction qui accepte une chaîne unique, et cette fonction est immédiatement appliquée à "def".

+1

Merci pour cette explication. J'étais si proche d'un DSL à part entière ... – jameszhao00

+0

Y a-t-il une raison pour laquelle vous ne pourriez pas lancer l'entrée à la DSL à travers une sorte de "préprocesseur" pour mettre des parenthèses autour de tout? –

+0

Yea a trouvé metalua. Cela fait ce que vous décrivez. – jameszhao00