사용자:Jesusmas/루아 강의/0
루아 강의 소개
[편집]루아 강의에서는 한국어 위키백과 그리고 미디어위키에서 사용할 수 있는 Lua 언어를 다룹니다. 한국어 위키백과에서는 2013년부터 Scribunto 확장 기능을 이용하여 루아를 이용하여 문서를 작성할 수 있습니다. 특히 틀 문서를 작성하는데 유용한 도구가 됩니다.
이 강의에서는 표준적인 루아가 아닌, 위키백과에서 사용할 수 있는 Scribunto 확장 기능을 다룹니다. 그렇게 해야만 위키백과에 활용하는데 실질적인 도움을 줄 수 있습니다.
표준적인 루아와의 차이점
[편집]위키백과에서 사용하는 Scribunto 확장은 표준적인 루아와는 차이가 있습니다. 그 중 가장 중요한 차이점은 두 가지입니다.
- 입출력 방법
- 우선, 위키백과에서 루아 프로그램을 사용하는 데에는 입력 방법에 제약이 있습니다. 문서를 작성할 때
{{#invoke:모듈명|함수명|(변수, ...)}}
방식으로만 자료를 전달할 수 있습니다. 프로그램을 실행하는 도중에 키보드를 누른다던가 하는 입력 방법은 허용되지 않습니다. - 출력의 경우에도 우리가 보통 사용하는
print
함수를 사용할 수 없습니다. 출력을 하려면, 그 출력하고 싶은 값을 프로그램의 실행을 마칠 때 리턴해 주여야 합니다. 따라서 입력과 마찬가지로 출력에서도 프로그램을 실행하는 도중에 출력하는 일이 있을 수 없습니다. 입출력에 대한 자세한 설명은 나중에 다룹니다.
- 우선, 위키백과에서 루아 프로그램을 사용하는 데에는 입력 방법에 제약이 있습니다. 문서를 작성할 때
- 자료형
- 루아의 자료형은 총 8 종류입니다. 그 중 2 종류는 사용하지 않습니다. 그 중 하나는
userdata
라는 자료형입니다. 이 자료형은 C 언어에서 만든 자료형(pointer와 struct)을 루아에서 사용할 수 있게 해 주는 것인데, 현재 한국어 위키백과에서는 C 언어를 사용하는 방법이 존재하지 않으므로 이 자료형도 사용하지 않습니다. - 또다른 하나는
thread
라는 것입니다. 이것은 루아에서 존재하는 coroutine이라는 다소 독특한 함수 유사체를 다루는 것인데, 위키백과에서 사용하지 않는 것으로 합니다. - 따라서 우리가 알아야 하는 자료형은 6 종류이며 그것은
nil
,boolean
,number
,string
,table
,function
입니다. 사실 이 6 종류의 자료형에 대해서만 철저하게 이해하고 있다면 한국어 위키백과에서 루아를 이용하여 틀 기능을 확장하는데 무리가 없을 것입니다.
- 루아의 자료형은 총 8 종류입니다. 그 중 2 종류는 사용하지 않습니다. 그 중 하나는
모듈 문서 만들기
[편집]한국어 위키백과에서 루아 프로그램을 사용하기 위해서는 자신의 모듈 문서를 만들어서 저장해야 합니다. 프로그램을 저장하지 않고서는 실행할 방법이 없으며, 따라서 한참 실행하다가 저장을 못하고 프로그램을 잃어버리는 일은 있을 수 없습니다. 다른 문서들과 마찬가지로 모듈 문서 역시 변경된 이력이 저장되어 있으므로 필요할 때 복구하면 됩니다. 다른 이름공간과는 다르게, 소스 코드가 구문론적으로 잘못되어 있어서 해석하는 것이 불가능한 경우에는 저장이 되지 않습니다.
- 모듈 문서 역시 위키백과의 일부이므로 어떤 사용자에게 소유권이 있는 것은 아니지만 다른 사용자가 만든 모듈을 수정할 때는 주의할 필요가 있습니다. 잘못된 변경으로 인하여 프로그램이 파괴될 수도 있고, 그 모듈을 사용하고 있는 다른 문서들에 잘못된 영향을 줄 수 있는 까닭입니다.
- 모듈 문서를 만들기 위해서는 “모듈:문서명”과 같이 모듈이라는 이름공간에 문서를 만들면 됩니다. 위키백과는 문서들을 자동으로 루아 언어를 사용한 프로그램으로 인식합니다.
첫번째 예제
[편집]아래는 우리가 만들 수 있는 모듈 문서의 예제를 보여 줍니다. 이 예제는 모듈:user:Jesusmas/lecture/ex0 1에 저장되어 있습니다.
local p = {} --[[모든 모듈 문서는 반드시 어떤 테이블을 리턴해 주어야 하는데
여기에서는 p라는 변수에 테이블을 하나 생성해 주기로 했습니다.
{}는 빈 테이블을 생성합니다. 그리고 p는 이 테이블을 '참조'합니다.
]]
function p.hello(frame) -- 테이블 p에 hello라는 함수 하나를 만드는데
return "Hello, world!" --그 함수가 리턴해 주는 값이 바로 출력값이 됩니다.
end
return p -- 모듈의 마지막에는 반드시 우리의 테이블을 리턴해 주어야 합니다.
그리고 이 프로그램을 실행 하기 위해서는 {{#invoke:user:Jesusmas/lecture/ex0 1|hello}}
와 같이, 모듈 문서의 이름과 함수의 이름을 써 주면 됩니다. 위의 예제에는 테이블, 함수, 참조, 리턴과 같은 처음 나오는 개념들이 많기 때문에 어려울 수 있습니다. 그런 것들은 차차 설명할 것이므로 당장에 이해할 필요는 없습니다. 그냥 이런 방식으로 프로그램을 만든다는 점을 이해하시고 필요할 때 따라하시면 됩니다. 오해를 피하기 위해서 덧붙이자면 하나의 모듈에 하나의 함수만을 담아야 하는 것은 아닙니다. 여러 개의 함수가 있는 모듈도 있습니다.
- 입력
{{#invoke:user:Jesusmas/lecture/ex0 1|hello}}
- 실행 결과
- Hello, world!
두번째 예제
[편집]아래와 같은 방식도 많이 애용되고 있습니다. 이 예제는 모듈:user:Jesusmas/lecture/ex0 2에 저장되어 있습니다.
local function hello(frame) -- 우선 hello라는 함수 하나를 만들고
return "Hello, world!"
end
return {hello=hello} -- 마지막에 테이블을 하나 생성해 리턴해 주는 방식도 애용됩니다.
여전히 당장에 원리를 이해할 필요는 없습니다. 단지 다른 사용자가 만든 프로그램이 이런 형식이라면 어느 함수를 사용할 수 있는지 알고 있으면 됩니다.
- 입력
{{#invoke:user:Jesusmas/lecture/ex0 2|hello}}
- 실행 결과
- Hello, world!
세번째 예제
[편집]한 문장으로 만들어 본 방식입니다. 이 예제는 모듈:user:Jesusmas/lecture/ex0 3에 저장되어 있습니다.
return {
hello = function (frame)
return "Hello, world!"
end
} --한 문장으로 만든 예제
굉장히 심플한 방법입니다.
- 입력
{{#invoke:user:Jesusmas/lecture/ex0 3|hello}}
- 실행 결과
- Hello, world!
주석문
[편집]다른 언어들과 마찬가지로 루아도 주석을 가지고 있습니다. 주석은 코드를 읽는 사람에게는 보이지만, 언어를 해석하는 컴파일러 또는 인터프리터에게는 무시되는 문구들을 말합니다. 다시 다시 말하면 프로그램을 실행하는 위키백과는 주석문을 해석하지도 실행하지도 않습니다. 루아에서도 한 줄 주석문과 긴 주석문이 있습니다. 한줄 주석문은 --
로 시작하여, 그 열의 끝까지입니다. 루아에서 더욱 놀라운 것은 긴 주석문입니다. 이중 각괄호를 사용하여, --[[
로 시작해서 ]]
까지가 주석이 됩니다. 이중 각괄호사이에 원하는 만큼 등호를 넣어서, 같은 수의 등호를 가지는 쌍까지가 주석이 되게 할 수 도 있습니다.
같이 보기
[편집]- 백:루아
- (영어) mw:Extension:Scribunto/Lua reference manual - 루아 레퍼런스 매뉴얼