Definições de função

A sintaxe para a definição da função é

function ::= function funcbody
funcbody ::= `(´ [parlist] `)´ block end
O seguinte recurso sintático simplifica as definições de função:
statement ::= function funcname funcbody
statement ::= local function Name funcbody
funcname ::= Name {`.´ Name} [`:´ Name]
A instrução
function f () body end
traduz-se em
f = function () body end
A instrução
function t.a.b.c.f () body end
traduz-se em
t.a.b.c.f = function () body end
A instrução
local function f () body end
traduz-se em
local f; f = function () body end
não para
local f = function () body end
(Isso só faz diferença quando o corpo da função contém referências a ' f)

Uma definição de função é uma expressão executável, cujo valor tem o tipo função. Quando Lua pré-compila um trecho, todos os corpos de suas funções também são pré-compilados. Então, sempre que Lua executa a definição da função, a função é instanciada (ou fechada). Essa instância de função (ou fechamento) é o valor final da expressão. Instâncias diferentes da mesma função podem se referir a variáveis locais externas diferentes e podem ter tabelas de ambiente diferentes.

Os parâmetros funcionam como variáveis locais que são inicializadas com os valores dos argumentos:

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

Quando uma função é chamada, a lista de argumentos é ajustada ao comprimento da lista de parâmetros, a menos que a função seja uma variadic ou ' função vararg, que é indicada por três pontos ('...') no final de sua lista de parâmetros. Uma função vararg não ajusta sua lista de argumentos; em vez disso, ela coleta todos os argumentos extras e os fornece à função por meio de uma expressão vararg, que também é escrita com três pontos. O valor dessa expressão é uma lista de todos os argumentos extras reais, semelhante a uma função com vários resultados. Se uma expressão vararg for usada dentro de outra expressão ou no meio de uma lista de expressões, sua lista de retorno será ajustada para um elemento. Se a expressão for usada como o último elemento de uma lista de expressões, nenhum ajuste será feito (a menos que a última expressão esteja entre parênteses).

Como exemplo, considere as seguintes definições:
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
Então, temos o seguinte mapeamento de argumentos para parâmetros e para a expressão 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 

Os resultados são retornados usando a instrução return (consulte Estruturas de controle). Se o controle chegar ao final de uma função sem encontrar uma instrução de retorno, a função retornará sem resultados.