함수 정의
함수 정의의 구문은 다음과 같습니다.
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 [`,´ `...´] | `...´함수가 해당 매개변수 목록의 끝에서 세 점('...')으로 표시되는 variadic 또는 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문을 사용하여 리턴됩니다(제어 구조 참조). 제어가 return문 없이 함수의 끝에 도달하는 경우 함수는 결과 없이 리턴합니다.