위키백과:루아
| 이 문서는 한국어 위키백과의 정보문입니다. 이 문서는 정책과 지침은 아니지만, 위키백과의 규범과 관습 측면에서 공동체의 확립된 관행을 설명하고 있습니다. 공동체의 총의나 검토를 어느 정도 반영하고 있습니다. |
| 위키백과 이름공간 | |||
|---|---|---|---|
| 기본 이름공간 | 토론 이름공간 | ||
| 0 | 일반 | 토론 | 1 |
| 2 | 사용자 | 사용자토론 | 3 |
| 4 | 위키백과 | 위키백과토론 | 5 |
| 6 | 파일 | 파일토론 | 7 |
| 8 | 미디어위키 | 미디어위키토론 | 9 |
| 10 | 틀 | 틀토론 | 11 |
| 12 | 도움말 | 도움말토론 | 13 |
| 14 | 분류 | 분류토론 | 15 |
| 100 | 포털 | 포털토론 | 101 |
| 102 | 위키프로젝트 | 위키프로젝트토론 | 103 |
| 118 | 초안 | 초안토론 | 119 |
| 710 | TimedText | TimedText talk | 711 |
| 828 | 모듈 | 모듈토론 | 829 |
| 1728 | 행사 | 행사토론 | 1729 |
| 가상 이름공간 | |||
| -1 | 특수 | ||
| -2 | 미디어 | ||
현재 목록 (API 호출) | |||
루아는 위키백과에서 모듈을 제작할 때 사용할 수 있는 프로그래밍 언어입니다.
루아 코드는 모듈:Yesno(예아니요)처럼 모듈: 이름공간에 저장됩니다.
모듈 기능은 미디어위키의 Scribunto 확장 기능을 통해 구현되었으며 현재 루아 언어만 지원하고 있습니다.
모듈은 틀 문서에서 Scribunto의 기능 중 하나인 {{#invoke:모듈 이름|함수 이름|매개변수}} 문법을 이용하여 한 번의 호출마다 1개의 함수씩 사용할 수 있습니다.[1]
모듈 실행하기
[편집]모듈은 모듈 이름공간을 제외한 모든 이름공간에서 {{#invoke:모듈 이름}}을 사용하여 실행할 수 있습니다. 매개변수로 준 입력값들을 기반으로 처리한 결과값을 받을 수 있다는 점에서 {{틀 이름}} 문법으로 틀이 동작하는 방식과 {{#invoke:모듈 이름}} 문법으로 모듈이 동작하는 방식은 비슷합니다. 하지만 몇 가지 차이점이 있는데, 그 중 대표적인 차이점은 모듈을 사용하고자 할 땐 사용하려는 하는 모듈 안 ‘함수 이름’을 적어줘야 한다는 점입니다. 여기서 ‘함수’의 의미란 값들을 입력받아 처리한 후에 그 결과값을 반환하는 명령문들을 모아놓은 것을 말합니다.[2] 또 다른 차이점으로는 1개의 틀 문서에는 1개의 틀만 정의할 수 있는 반면, 1개의 루아 모듈 문서에는 여러 개의 함수를 정의할 수 있다는 점입니다.[3]
그뿐만 아니라 단독으로 사용할 수 있는 틀과는 달리 루아 모듈은 그 자체만 가지고는 직접 실행할 수 없으며 한 번의 invoke당 하나의 함수만 실행할 수 있다는 차이점도 있습니다. 모듈은 함수들을 모아놓은 것에 불과하며 모듈 자체로는 아무것도 하지 못합니다.[4] 결국 루아 엔진이 모듈을 불러왔을 때 함수 이름을 기재하지 않은 경우 모듈 그 자체를 실행할 수 없는데다 모듈 안의 함수 중에서 어떤 함수를 실행해야 할 지 모르기 때문에, 모듈을 사용하고자 할 땐 사용하려는 함수 이름을 같이 넣어주어야 합니다.
위키 문서에서 모듈을 실행하는 가장 간단한 방법은 다음과 같습니다.
{{#invoke:모듈 이름|함수 이름}}
예를 하나 들자면, 모듈:HelloWorld에 있는 "hello"란 이름을 가진 함수는 아래의 구문과 같은 방식으로 실행할 수 있습니다.
설치하거나 저장할 필요가 없습니다.
- 사용자 문서를 편집하세요.
- 사용자 문서의 새 줄 맨 앞에 다음 호출을 붙여넣으세요:
{{#invoke:HelloWorld|hello}}
미리보기를 클릭하세요. 모듈:HelloWorld의 함수hello호출은 다음으로 대체됩니다:
Hello World!
취소를 클릭하세요. 확인 창이 뜨면떠나기를 클릭하세요.- 사용자 문서는 수정되지 않은 상태로 남아 있습니다.
콘솔 디버그: 루아 학습 시작
[편집]루아 Scribunto의 콘솔 디버그는 위키백과에서 루아를 배우기 위한 안전한 대화형 도구입니다.
- 모듈:Yesno 문서에서
원본 보기를 클릭하세요. - 페이지 맨 아래의
콘솔 디버그섹션으로 스크롤하세요. - 주석과 호출을 회색 입력 상자(
지우기버튼 위)에 붙여넣으세요.
--[[당신의 첫 번째 루아 Hello World 스타일 프로그램]]-- print("어서 오세요 " .. _VERSION .. "!") -- 루아 버전과 `..` 연산자로 문자열 연결
- ↵ Enter 키를 한 번 눌러 두 개의 루아 명령을 실행하세요.
- 결과는 루아
print명령줄 아래에 나타납니다:
어서 오세요 Lua 5.1!
- ↑
위쪽 화살표키를 눌러 이전 루아 명령을 순환하세요. - 선택적으로
지우기를 클릭하면콘솔 디버그만 지워집니다; 위의 루아 편집기는 수정되지 않은 상태로 남아 있습니다.
- 콘솔 디버그의 HTML 생성기
모듈:HelloWorld의 함수 hello를 호출하세요:
local modHello = require('모듈:HelloWorld') -- 콘솔 디버그에서 모듈 로드 local frame = mw.getCurrentFrame(); print(modHello.hello(frame)) -- "Hello World!" 표시
Hello World!
- 항등 함수
파서 함수 #if 호출
local yesno = require('모듈:Yesno') -- #if yesno이면 입력 매개변수를 그대로 반환 print(mw.getCurrentFrame():callParserFunction("#if", yesno("예"), "예", '아니요')) print(mw.getCurrentFrame():callParserFunction("#if", yesno('아니요'), "예", '아니요'))
예 아니요
- 보호된
모듈:Yesno를 닫습니다. 이 모듈은 수정되지 않은 상태로 남아 있습니다.
매개변수 사용하기
[편집]매개변수는 틀에 전달되는 방식과 동일한 방식을 이용하여 모듈에 전달됩니다. 하지만 주의해야 할 것이 있는데, 첫 번째 수직선 문자(|)의 뒤에 위치해야 하는 것은 반드시 함수 이름이여야 하며, 모듈로 전달될 첫 번째 매개변수는 두 번째 수직선 문자(|)의 뒤에 위치해야 한다는 것입니다.
{{#invoke:모듈 이름|함수 이름|첫 번째 변수|두 번째 변수|변수 이름=값}}
예를 몇개 들자면, 모듈:BananasArgs의 "hello" 함수는 다음의 코드처럼 첫 번째 매개변수에 따라 서로 다른 사람들에게 인사합니다.
사용자 문서에서:
# {{#invoke:BananasArgs|hello|서연}} # {{#invoke:BananasArgs|hello|민준}}
- 안녕하세요, 서연님!
- 안녕하세요, 민준님!
모듈:Yesno의 콘솔 디버그에서:
local modArg = require('모듈:BananasArgs') -- 콘솔 디버그에서 모듈 로드 print("1. " .. modArg.hello({args={"서연"}})) -- 유니코드 문자열 전달하기 print("2. " .. modArg.hello({args={"민준"}}))
1. 안녕하세요, 서연님! 2. 안녕하세요, 민준님!
또한 BananasArgs엔 바나나와 사과란 (이름을 가진) 매개변수를 사용하여 사용자가 가지고 있는 바나나와 사과의 갯수를 입력받는 "count_fruit"란 함수가 존재하며 다음과 같이 동작합니다.
사용자 문서에서:
# {{#invoke:BananasArgs|count_fruit|사과=3|바나나=4}} # {{#invoke:BananasArgs|count_fruit|바나나=5|사과=2}}
- 저는 바나나 4개와 사과 3개를 가지고 있습니다.
- 저는 바나나 5개와 사과 2개를 가지고 있습니다.
모듈:Yesno의 콘솔 디버그에서:
local modArg = require('모듈:BananasArgs') -- 콘솔 디버그에서 모듈 로드 print("1. " .. modArg.count_fruit({args={["바나나"]="4", ["사과"]="3"}})) -- 문자열로 된 숫자들 print("2. " .. modArg.count_fruit({args={["바나나"]="5", ["사과"]="2"}}))
1. 저는 바나나 4개와 사과 3개를 가지고 있습니다. 2. 저는 바나나 5개와 사과 2개를 가지고 있습니다.
대부분의 모듈은 사용할 수 있는 매개변수들과 그 매개변수들이 어떤 역할을 하는지를 잘 설명한 설명문서를 가지고 있습니다.
예제 모듈
[편집]- 모듈:Bananas: 가장 간단한 구문으로, 매개변수가 없는 함수 하나를 제공합니다.
- 모듈:BananasArgs: 변수에 접근하여 사용하는 방법을 설명합니다.
도움 요청
[편집]루아를 이용해서 틀을 만드는데 도움을 얻고 싶다면 위키백과토론:루아나 위키백과:사랑방 (기술)에 요청을 남겨 주세요.
루아 소개
[편집]루아는 자료를 분석하고, 수식을 계산하며, 함수와 객체지향 프로그래밍을 사용한 결과를 서식화하는 스크립트 언어입니다. 어떤 루아 스크립트는 간단하지만, 표, 동적 함수, 연관 배열을 사용해서 컴퓨터 과학자들에게 흥미를 끌 정도로 복잡한 구문도 만들 수 있습니다.루아는 함수를 재귀적으로 사용할 수 있기 때문에 다른 사용자들이 모듈을 편집하는데 혼란을 줄 정도로 복잡하게 만들어서는 안됩니다. 아래는 모듈:HelloWorld에서 볼 수 있으며 "hello" 함수를 만드는 소스코드입니다:
-- 위키백과의 모든 모듈은 테이블 변수를 정의해주는 것부터 시작해야 합니다.
-- 이 변수는 모듈 외부에서 접근하는 함수들이 이 모듈을 쓸 수 있게끔 해줍니다.
my_object = {}; -- 테이블 패키지를 빈 테이블로 정의합니다.
-- 테이블 변수에 함수를 추가합니다. 함수를 쓸땐 #invoke 명령어로 쓸수 있습니다.
-- "frame"엔 위키백과에서 함수를 호출했을 때 같이 전달된 데이터(매개변수 등)가
-- 포함되어 있을 것입니다.
my_object.hello = function(frame) -- 입력 매개변수 frame은 사용되지 않습니다.
-- 지역 변수를 선언한 뒤 데이터를 넣습니다.
-- (이 과정을 '값을 대입한다'라고 표현하기도 합니다.)
local str = "Hello World!"
-- 함수를 종료함과 동시에 "str"의 데이터를 위키백과로 반환합니다.
-- "print" 함수는 허용되지 않으므로 위키백과로 출력할 데이터들은 이 방법처럼
-- 문자열로 반환해야 합니다.
return str
-- 함수의 끝입니다.
end
-- 위키백과의 모든 모듈은 함수가 포함된 변수를 반환하는 것으로 끝나야 합니다.
return my_object -- 테이블 패키지를 반환합니다.
-- 이제 {{#invoke: HelloWorld | hello }}를 통해 이 모듈을 쓸 수 있습니다.
-- #invoke 명령어를 쓸 땐 모듈의 이름(HelloWorld)을 넣고,
-- 쓰고자 하는 함수의 이름(hello)을 매개변수로 넣어줍니다.
루아 코드의 샘플은 <syntaxhighlight lang="lua">...</syntaxhighlight> 태그를 사용하여 나타낼 수 있습니다. 루아에 대한 더 자세한 설명은 루아 (프로그래밍 언어)에서 찾을 수 있습니다. 미디어 위키에서 루아를 사용하는 방법은 mw:Extension:Scribunto/Lua reference manual에서 찾을 수 있습니다.
유닛 테스트
[편집]위키백과엔 모듈:UnitTests이라는 루아 스크립트를 위한 유닛 테스팅 프레임워크가 있습니다. 이 프레임워크는 여러 개의 입력값을 여러분의 스크립트에 넣은 뒤 결과값이 기대한대로 잘 출력되는지 확인할 수 있게 해줍니다. 또한 유닛 테스트 기법을 사용하기 때문에 스크립트를 수정하면서 발생한 새로운 문제들, 즉 회귀 버그를 빠르게 잡아낼 수 있어서 매우 유용합니다.
유닛 테스트를 수행하는 모듈은 영어 위키백과의 관례에 따라 테스트 대상 모듈의 '시험장' 하위문서에 저장하며, 그 하위문서의 토론문서에서 유닛 테스트를 실행합니다. 예로 들어 모듈:Bananas 같은 모듈이 있을 경우, 이 모듈의 유닛 테스트는 모듈:Bananas/시험장에 위치하게 되며, 모듈토론:Bananas/시험장에서 {{#invoke:Bananas/시험장|run_tests}}식으로 실행시킵니다. 또한 테스트 메소드의 이름은 반드시 "test"로 시작해야 합니다. 아래는 모듈:Bananas/시험장에서 가져온 간단한 예제입니다.
사용자 문서에서:
{{#invoke:Bananas/시험장|run_tests}}
모든 1개의 테스트를 통과했습니다.
test_hello
test_hello 텍스트 예상 실제 {{#invoke:Bananas | hello}} Hello, world! Hello, world!
모듈:Yesno의 콘솔 디버그에서:
local modTest = require('모듈:Bananas/시험장') print(modTest.run_tests(mw.getCurrentFrame()))
<b style="color:#008000">모든 1개의 테스트를 통과했습니다.</b> <h2>test_hello</h2> {|class="wikitable unit-tests-result" |+ test_hello ! !! 텍스트 !! 예상 !! 실제 |- | [[파일:Antu mail-mark-notjunk.svg|class=notpageimage|20px|alt=예|링크=]]<span style="display:none">예</span> | {{#invoke:Bananas | hello}} | Hello, world! | Hello, world! |- |}
--[[모듈:Bananas/시험장]]-- local p = require('모듈:UnitTests') function p:test_hello() -- Bananas의 테스트 케이스입니다. 테스트를 하려면 '토론'을 클릭하세요 self:preprocess_equals('{{#invoke:Bananas | hello}}', 'Hello, world!') end return p
유닛 테스트를 수행하는 모든 모듈들을 보려면 특수:가리키는문서/모듈:UnitTests을 참조하세요.
또한 모듈:ScribuntoUnit이라 불리는 헝가리어 위키백과에서 유래한 대용 유닛 테스팅 프레임워크가 있습니다. 모듈:UnitTests와 기능이 매우 비슷하나 코딩 스타일이 다를 뿐더러 보호된 호출(pcall)로 잡은 실제 오류를 던져줍니다. 또한 주어진 정밀도 내에서 실수를 비교하는 메소드도 가지고 있습니다.
위키백과에 특별히 적용되는 특징
[편집]무엇보다 먼저, 루아는 {{#invoke:}}를 통하여 문자열만을 변수로 전달받을 수 있습니다. 또한 frame:expandTemplate, frame:preprocess 등을 통과한 문자열들만 전달받을 수 있습니다. 또한 위키백과의 루아는 저장 전 변환[5]이나, 틀 또는 {{...}} 구문들을 포함한 문자열은 정상적으로 출력할 수 없습니다. 또한, 한 문서에 포함되는 모든 루아 프로그램은 CPU 시간[6]이 10초를 넘어서는 안됩니다. 그리고 Scribunto 확장 루아는 표준 루아에 비해서 몇몇 함수가 부족합니다.[7]
다음과 같이 mw.ustring 함수를 string 대신 사용하는 것이 권장됩니다.
local content_lang = mw.getContentLanguage().code -- ko local lang = mw.getCurrentFrame():callParserFunction("#language", content_lang) -- 한국어 local lenUnicode, lenByte, lenSharp = mw.ustring.len(lang), string.len(lang), #lang print(("Content: '%s'. Lang: 「%s」 Mw.ustring.len = %d String.len = %d Sharp = %d"):format(content_lang, lang, lenUnicode, lenByte, lenSharp))
디버그 콘솔은 유니코드를 지원합니다.
Content: 'ko'. Lang: 「한국어」 Mw.ustring.len = 3 String.len = 9 Sharp = 9
조사 붙은 명사 조각
[편집]사용자 문서에서:
한 {{#invoke:Hangul|josa|str=[[사과]]|josa=은}} 맛있다.
한 사과는 맛있다.
모듈:Yesno의 콘솔 디버그에서:
local one = '한 ' -- 단수로 강제하는(단수 문맥을 만드는) 목적 local apple = '사과' -- 명사(noun ended by the combined vowel ㅘ in the final syllable 과) local topicMarker = '은' -- 조사(josa): 받침 유무에 따라 은/는 형태가 바뀜 (예: 책은) local predicate = ' 맛있다.' -- 형용사/서술어: is delicious (tense/aspect expressed in this predicate) local modHangul = require('모듈:Hangul') -- 한글 sound-based alternation local frame = mw.getCurrentFrame() frame.args = {str = apple, josa = topicMarker} --[[모듈:Hangul/data]]-- -- match rule 4 { "와(과)", "와", "과", "과"} in particle_map local markedNoun = modHangul.josa(frame) -- side effect of mw.log(#rules) = 14 rules print(one .. markedNoun .. predicate) -- 한 사과는 맛있다. (josa-attached noun)
다음: ‘사과’의 마지막 음절 ‘과’의 모음 ㅘ 뒤에서는 주제 조사 ‘는’을 씁니다.
14 한 사과는 맛있다.
루아 입력 제한
[편집]Scribunto 루아 코드는 문서를 해석할 때에만 실행됩니다. 그러므로 사용자 입력은 문서를 편집함으로써만 할 수 있습니다. 키보드로 수치를 입력 받아 제곱근을 구하는 함수를 만들 수도 없고, 만델브로 집합의 일부분을 마우스로 클릭하면 그 부분을 다시 계산해서 보여주는 함수를 만들 수도 없습니다. 루아 입력은 틀처럼 포함할 수 있는 문자열 문서[8]를 담을 수 있지만, 그림 파일,[9] 분류 문서에 보이는 문서의 목록, 또는 위키백과:특수 문서로 볼 수 있는 내용은 입력할 수 없습니다.
루아 틀 표시하기
[편집]루아를 사용하는 틀에 {{루아}}를 붙여 주세요. 루아의 사용과 틀의 편집에 관한 의사소통에 도움을 줍니다. 그 틀은 아래와 같습니다:
| 이 틀은 루아를 사용합니다. |
분류:루아 틀에서 루아를 사용하는 틀을 모두 보실 수 있습니다.
각주
[편집]- ↑ 예로 들어 모듈:Bananas/설명문서에선 "Hello, world!"를 출력하기 위해
{{#invoke:Bananas|hello}}코드를 사용하고 있습니다. - ↑ 여러 개의 결과값을 반환할 수도 있지만 그런 함수들은 일반적으로 위키 문서에서 잘 쓰이지 않습니다.
- ↑ 하지만 어떤 루아 모듈엔 함수가 한 개도 없을 수 있으며, 이런 모듈은 당연히 일반 문서에서 사용할 수 없으며 특수한 용도로 사용됩니다.
- ↑ 하지만 예외적인 경우가 있는데, 다른 모듈에게 자신이 가진 변수의 값을 제공할 목적으로써 함수없이 미리 정의된 값을 담은 변수들만 가진 경우도 있을 수 있습니다.
- ↑ 대표적인 것은 ~~~~ 문자열을 서명으로 변환하는 것입니다.
- ↑ 출력된 문서의 소스 코드를 조사하면 틀이나 모듈을 처리하는데 얼마의 시간이 걸렸는지 알 수 있습니다.
- ↑ 이에 대하여 (영어)mw:Extension:Scribunto/Lua reference manual#Differences from standard Lua를 참조하십시오.
- ↑ 틀과 같이 {{ }}안에 담을 수 있는 문서들을 말합니다.
- ↑ SVG 파일은 실제로는 문자열이지만, 문자열로 된 문서에 내용을 복사해 오지 않으면 입력할 수 없습니다.
함께 보기
[편집]- 특수기능:접두어찾기/모듈: - 루아 모듈 목록
- 특수기능:접두어찾기/모듈:연습장 - 루아 모듈 연습장 목록
- (영어) mw:Extension:Scribunto/Lua reference manual - 루아 레퍼런스 매뉴얼