사용자: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!

주석문

편집

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

같이 보기

편집