Definizioni delle funzioni

La sintassi per la definizione delle funzioni è

function ::= function funcbody
funcbody ::= `(´ [parlist] `)´ block end
Il seguente zucchero sintattico semplifica le definizioni delle funzioni:
statement ::= function funcname funcbody
statement ::= local function Name funcbody
funcname ::= Name {`.´ Name} [`:´ Name]
La dichiarazione
function f () body end
si traduce in
f = function () body end
La dichiarazione
function t.a.b.c.f () body end
si traduce in
t.a.b.c.f = function () body end
La dichiarazione
local function f () body end
si traduce in
local f; f = function () body end
non a
local f = function () body end
(Questo fa la differenza solo quando il corpo della funzione contiene riferimenti a 'f)

Una definizione di funzione è un'espressione eseguibile, il cui valore è di tipo function. Quando Lua precompila un chunk, vengono precompilati anche tutti i corpi delle sue funzioni. Quindi, ogni volta che Lua esegue la definizione di funzione, la funzione viene istanziata (o chiusa). Questa istanza di funzione (o chiusura) è il valore finale dell'espressione. Istanze diverse della stessa funzione possono fare riferimento a variabili locali esterne diverse e possono avere tabelle di ambiente diverse.

I parametri agiscono come variabili locali che vengono inizializzate con i valori degli argomenti:

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

Quando si chiama una funzione, l'elenco degli argomenti viene adattato alla lunghezza dell'elenco dei parametri, a meno che non si tratti di una funzione variadica o vararg, indicata da tre punti ('...') alla fine dell'elenco dei parametri. Una funzione vararg non adatta il suo elenco di argomenti, ma raccoglie tutti gli argomenti extra e li fornisce alla funzione attraverso un'espressione vararg, che si scrive anche con tre punti. Il valore di questa espressione è un elenco di tutti gli argomenti extra effettivi, simile a una funzione con più risultati. Se un'espressione vararg viene utilizzata all'interno di un'altra espressione o nel mezzo di un elenco di espressioni, il suo elenco di ritorno viene adattato a un elemento. Se l'espressione viene utilizzata come ultimo elemento di un elenco di espressioni, non viene effettuata alcuna correzione (a meno che l'ultima espressione non sia racchiusa tra parentesi).

A titolo di esempio, si considerino le seguenti definizioni:
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
Si ha quindi la seguente mappatura dagli argomenti ai parametri e all'espressione 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 

I risultati vengono restituiti utilizzando l'istruzione return (vedere Strutture di controllo). Se il controllo raggiunge la fine di una funzione senza incontrare un'istruzione di ritorno, la funzione ritorna senza risultati.