Definiciones de función

La sintaxis para la definición de funciones es

function ::= function funcbody
funcbody ::= `(´ [parlist] `)´ block end
El siguiente azúcar sintáctico simplifica las definiciones de funciones:
statement ::= function funcname funcbody
statement ::= local function Name funcbody
funcname ::= Name {`.´ Name} [`:´ Name]
La sentencia
function f () body end
se traduce por
f = function () body end
La sentencia
function t.a.b.c.f () body end
se traduce por
t.a.b.c.f = function () body end
La sentencia
local function f () body end
se traduce por
local f; f = function () body end
no a
local f = function () body end
(Esto sólo supone una diferencia cuando el cuerpo de la función contiene referencias a " f)

Una definición de función es una expresión ejecutable, cuyo valor tiene el tipo función. Cuando Lua precompila un chunk, todos los cuerpos de sus funciones también son precompilados. Entonces, cada vez que Lua ejecuta la definición de función, la función es instanciada (o cerrada). Esta instancia de función (o cierre) es el valor final de la expresión. Diferentes instancias de la misma función pueden referirse a diferentes variables locales externas y pueden tener diferentes tablas de entorno.

Los parámetros actúan como variables locales que se inicializan con los valores de los argumentos:

parlist ::= namelist [`,´ `...´] | `...´

Cuando se llama a una función, la lista de argumentos se ajusta a la longitud de la lista de parámetros, a menos que la función sea variádica o vararg, lo que se indica con tres puntos ('...') al final de su lista de parámetros. Una función vararg no ajusta su lista de argumentos, sino que recoge todos los argumentos adicionales y los suministra a la función a través de una expresión vararg, que también se escribe con tres puntos. El valor de esta expresión es una lista de todos los argumentos extra reales, similar a una función con múltiples resultados. Si una expresión vararg se utiliza dentro de otra expresión o en medio de una lista de expresiones, su lista de retorno se ajusta a un elemento. Si la expresión se utiliza como último elemento de una lista de expresiones, no se realiza ningún ajuste (a menos que esa última expresión esté encerrada entre paréntesis).

A modo de ejemplo, considere las siguientes definiciones:
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
Entonces, tenemos el siguiente mapeo de argumentos a parámetros y a la expresión vararg:
CALL     PARAMETERS 
f(3)          a=3, b=null 
f(3, 4)       a=3, b=4 
f(3, 4, 5)    a=3, b=4 
f(r(), 10)    a=1, b=10 
f(r())        a=1, b=2 
g(3)          a=3, b=null, ... --> (nothing) 
g(3, 4)       a=3, b=4, ... --> (nothing) 
g(3, 4, 5, 8) a=3, b=4, ... --> 5 8 
g(5, r())     a=5, b=1, ... --> 2 3 

Los resultados se devuelven mediante la sentencia return (véase Estructuras de control). Si el control llega al final de una función sin encontrar una sentencia return, entonces la función vuelve sin resultados.