Lua Closures en la implementación de un DSL
-
07-07-2019 - |
Pregunta
Lua tiene una sintaxis de llamada sin paréntesis realmente agradable que, junto con los cierres de funciones, me permite escribir lo siguiente
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
{
}
Sin embargo, si elimino el paréntesis (etiqueta), se produce un error de compilación. Entonces, ¿por qué Lua permite los parámetros sin paréntesis (es decir, " def ") y no los parámetros var sin paréntesis (tabla en este caso)?
Solución
De Programación en Lua :
Si la función tiene un solo argumento y este argumento es una cadena literal o un constructor de tabla, entonces los paréntesis son opcionales:
Comprendo su situación anterior es que la etiqueta es una variable local (que no es una cadena literal ni un constructor de tablas), por lo que test (etiqueta)
siempre requiere paréntesis. no necesita paréntesis alrededor de " def "
porque test (tag)
devuelve una función que acepta una sola cadena, y esa función es aplicado inmediatamente a " def "
.