함수 정의

함수 정의의 구문은 다음과 같습니다.

function ::= function funcbody
funcbody ::= `(´ [parlist] `)´ block end
다음 문법적 설탕(syntactic sugar)은 함수 정의를 단순화합니다.
statement ::= function funcname funcbody
statement ::= local function Name funcbody
funcname ::= Name {`.´ Name} [`:´ Name]
여기서
function f () body end
다음으로 변환됩니다.
f = function () body end
여기서
function t.a.b.c.f () body end
다음으로 변환됩니다.
t.a.b.c.f = function () body end
여기서
local function f () body end
다음으로 변환됩니다.
local f; f = function () body end
하지 않습니다
local f = function () body end
(이는 함수의 본문이 f에 대한 참조를 포함하는 경우에만 차이가 있습니다.)

함수 정의는 값에 유형 함수가 있는 실행할 수 있는 표현식입니다. Lua가 청크를 사전 컴파일할 때 모든 해당 함수 내용도 사전 컴파일됩니다. 그런 다음 Lua가 함수 정의를 실행할 때마다 함수가 인스턴스화됩니다(또는 닫힘). 이 함수 인스턴스(또는 폐쇄)는 표현식의 최종값입니다. 동일한 함수의 다른 인스턴스는 다른 외부 로컬 변수를 참조할 수 있으며 다른 환경 테이블을 가질 수 있습니다.

매개변수는 인수 값으로 초기화되는 로컬 변수로 작동합니다.

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

함수가 호출되면 인자 목록은 매개변수 목록 끝에 점 3개('...')로 표시되는 변수 함수 또는 vararg 함수가 아닌 한 매개변수 목록의 길이에 맞게 조정됩니다. vararg 함수는 해당 인수 목록을 조정하지 않습니다. 대신 모든 추가 인수를 수집하고 세 점으로 작성된 vararg 표현식을 통해 함수에 이를 제공합니다. 이 표현식의 값은 다중 결과가 있는 함수와 유사한, 모든 실제 추가 인수의 목록입니다. vararg 표현식이 다른 표현식 내에서 사용되거나 표현식 목록의 중간에서 사용되는 경우 리턴 목록이 하나의 요소로 조정됩니다. 표현식이 표현식 목록의 마지막 요소로 사용되는 경우 조정되지 않습니다(마지막 표현식이 괄호 안에 있지 않은 경우).

예제로 다음 정의를 고려하십시오.
function f(a, b) end
function g(a, b, ...) end
function r() return 1,2,3 end
그런 다음, 다음과 같이 인수에서부터 매개변수로의, 그리고 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 

결과는 ' 반환 문을 사용하여 반환됩니다(' 제어 구조 참조). 제어가 return문 없이 함수의 끝에 도달하는 경우 함수는 결과 없이 리턴합니다.