Definizioni delle funzioni
La sintassi per la definizione delle funzioni è
function ::= function funcbody
funcbody ::= `(´ [parlist] `)´ block end
statement ::= function funcname funcbody
statement ::= local function Name funcbody
funcname ::= Name {`.´ Name} [`:´ Name]
function f () body end
si traduce inf = function () body end
function t.a.b.c.f () body end
si traduce int.a.b.c.f = function () body end
local function f () body end
si traduce inlocal f; f = function () body end
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).
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
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.