사용자: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 종류의 자료형에 대해서만 철저하게 이해하고 있다면 한국어 위키백과에서 루아를 이용하여 틀 기능을 확장하는데 무리가 없을 것입니다.

모듈 문서 만들기[편집]

한국어 위키백과에서 루아 프로그램을 사용하기 위해서는 자신의 모듈 문서를 만들어서 저장해야 합니다. 프로그램을 저장하지 않고서는 실행할 방법이 없으며, 따라서 한참 실행하다가 저장을 못하고 프로그램을 잃어버리는 일은 있을 수 없습니다. 다른 문서들과 마찬가지로 모듈 문서 역시 변경된 이력이 저장되어 있으므로 필요할 때 복구하면 됩니다. 다른 이름공간과는 다르게, 소스 코드가 구문론적으로 잘못되어 있어서 해석하는 것이 불가능한 경우에는 저장이 되지 않습니다.

  • 모듈 문서 역시 위키백과의 일부이므로 어떤 사용자에게 소유권이 있는 것은 아니지만 다른 사용자가 만든 모듈을 수정할 때는 주의할 필요가 있습니다. 잘못된 변경으로 인하여 프로그램이 파괴될 수도 있고, 그 모듈을 사용하고 있는 다른 문서들에 잘못된 영향을 줄 수 있는 까닭입니다.
  • 모듈 문서를 만들기 위해서는 “모듈:문서명”과 같이 모듈이라는 이름공간에 문서를 만들면 됩니다. 위키백과는 문서들을 자동으로 루아 언어를 사용한 프로그램으로 인식합니다.

첫번째 예제[편집]

아래는 우리가 만들 수 있는 모듈 문서의 예제를 보여 줍니다. 이 예제는 모듈: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!

주석문[편집]

다른 언어들과 마찬가지로 루아도 주석을 가지고 있습니다. 주석은 코드를 읽는 사람에게는 보이지만, 언어를 해석하는 컴파일러 또는 인터프리터에게는 무시되는 문구들을 말합니다. 다시 다시 말하면 프로그램을 실행하는 위키백과는 주석문을 해석하지도 실행하지도 않습니다. 루아에서도 한 줄 주석문과 긴 주석문이 있습니다. 한줄 주석문은 --로 시작하여, 그 열의 끝까지입니다. 루아에서 더욱 놀라운 것은 긴 주석문입니다. 이중 각괄호를 사용하여, --[[로 시작해서 ]]까지가 주석이 됩니다. 이중 각괄호사이에 원하는 만큼 등호를 넣어서, 같은 수의 등호를 가지는 쌍까지가 주석이 되게 할 수 도 있습니다.

같이 보기[편집]