Lua Closures dans la mise en œuvre d'un DSL
-
07-07-2019 - |
Question
Lua a une très belle syntaxe d’appel sans parenthèse qui, couplée aux fermetures de fonctions, me permet d’écrire ce qui suit
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 supprime la parenthèse autour de (balise), il en résulte une erreur de compilation. Alors, pourquoi Lua autorise-t-il les paramètres sans parenthèse (c'est-à-dire "def") et non sans parenthèse var (table dans ce cas)?
La solution
De la Programmation en Lua :
Si la fonction a un seul argument et qu'il s'agit d'une chaîne littérale ou d'un constructeur de table, les parenthèses sont facultatives:
Si j'ai bien compris la situation ci-dessus, cette balise est une variable locale (qui n'est ni une chaîne littérale ni un constructeur de table). Par conséquent, test (balise)
nécessite toujours des parenthèses. Vous n'avez pas besoin de parenthèses autour de " def &
car test (balise)
renvoie une fonction qui accepte une seule chaîne, et cette fonction est immédiatement appliqué à "def"
.