위키백과:루아
스크립트 오류: "" 모듈이 없습니다.
| 위키백과 이름공간 | |||
|---|---|---|---|
| 기본 이름공간 | 토론 이름공간 | ||
| 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개의 함수씩 사용할 수 있습니다.
모듈은 모듈 이름공간을 제외한 모든 이름공간에서 {{#invoke:모듈 이름}}을 사용하여 실행할 수 있습니다. 매개변수로 준 입력값들을 기반으로 처리한 결과값을 받을 수 있다는 점에서 {{틀 이름}} 문법으로 틀이 동작하는 방식과 {{#invoke:모듈 이름}} 문법으로 모듈이 동작하는 방식은 비슷합니다. 하지만 몇 가지 차이점이 있는데, 그 중 대표적인 차이점은 모듈을 사용하고자 할 땐 사용하려는 하는 모듈 안 ‘함수 이름’을 적어줘야 한다는 점입니다. 여기서 ‘함수’의 의미란 값들을 입력받아 처리한 후에 그 결과값을 반환하는 명령문들을 모아놓은 것을 말합니다. 또 다른 차이점으로는 1개의 틀 문서에는 1개의 틀만 정의할 수 있는 반면, 1개의 루아 모듈 문서에는 여러 개의 함수를 정의할 수 있다는 점입니다.
그뿐만 아니라 단독으로 사용할 수 있는 틀과는 달리 루아 모듈은 그 자체만 가지고는 직접 실행할 수 없으며 한 번의 invoke당 하나의 함수만 실행할 수 있다는 차이점도 있습니다. 모듈은 함수들을 모아놓은 것에 불과하며 모듈 자체로는 아무것도 하지 못합니다. 결국 루아 엔진이 모듈을 불러왔을 때 함수 이름을 기재하지 않은 경우 모듈 그 자체를 실행할 수 없는데다 모듈 안의 함수 중에서 어떤 함수를 실행해야 할 지 모르기 때문에, 모듈을 사용하고자 할 땐 사용하려는 함수 이름을 같이 넣어주어야 합니다.
위키 문서에서 모듈을 실행하는 가장 간단한 방법은 다음과 같습니다.
{{#invoke:모듈 이름|함수 이름}}
예를 하나 들자면, 모듈:HelloWorld에 있는 "hello"란 이름을 가진 함수는 아래의 구문과 같은 방식으로 실행할 수 있습니다.
설치하거나 저장할 필요가 없습니다.
- 사용자 문서를 편집하세요.
- 사용자 문서의 새 줄 맨 앞에 다음 호출을 붙여넣으세요:
{{#invoke:HelloWorld|hello}}
미리보기를 클릭하세요. 모듈:HelloWorld의 함수hello호출은 다음으로 대체됩니다:
Hello World!
취소를 클릭하세요. 확인 창이 뜨면떠나기를 클릭하세요.- 사용자 문서는 수정되지 않은 상태로 남아 있습니다.
루아 Scribunto의 콘솔 디버그는 위키백과에서 루아를 배우기 위한 안전한 대화형 도구입니다.
- 모듈:Yesno 문서에서
원본 보기를 클릭하세요. - 페이지 맨 아래의
콘솔 디버그섹션으로 스크롤하세요. - 주석과 호출을 회색 입력 상자(
지우기버튼 위)에 붙여넣으세요.
--[[당신의 첫 번째 루아 Hello World 스타일 프로그램]]-- print("어서 오세요 " .. _VERSION .. "!") -- 루아 버전과 `..` 연산자로 문자열 연결
- <templatestyles src="Template:키눌림/styles.css"></templatestyles>↵ Enter 키를 한 번 눌러 두 개의 루아 명령을 실행하세요.
- 결과는 루아
print명령줄 아래에 나타납니다:
어서 오세요 Lua 5.1!
- <templatestyles src="Template:키눌림/styles.css"></templatestyles>↑
위쪽 화살표키를 눌러 이전 루아 명령을 순환하세요. - 선택적으로
지우기를 클릭하면콘솔 디버그만 지워집니다; 위의 루아 편집기는 수정되지 않은 상태로 남아 있습니다.
- 콘솔 디버그의 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.png|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 등을 통과한 문자열들만 전달받을 수 있습니다. 또한 위키백과의 루아는 저장 전 변환[1]이나, 틀 또는 {{...}} 구문들을 포함한 문자열은 정상적으로 출력할 수 없습니다. 또한, 한 문서에 포함되는 모든 루아 프로그램은 CPU 시간[2]이 10초를 넘어서는 안됩니다. 그리고 Scribunto 확장 루아는 표준 루아에 비해서 몇몇 함수가 부족합니다.[3]
다음과 같이 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 루아 코드는 문서를 해석할 때에만 실행됩니다. 그러므로 사용자 입력은 문서를 편집함으로써만 할 수 있습니다. 키보드로 수치를 입력 받아 제곱근을 구하는 함수를 만들 수도 없고, 만델브로 집합의 일부분을 마우스로 클릭하면 그 부분을 다시 계산해서 보여주는 함수를 만들 수도 없습니다. 루아 입력은 틀처럼 포함할 수 있는 문자열 문서[4]를 담을 수 있지만, 그림 파일,[5] 분류 문서에 보이는 문서의 목록, 또는 위키백과:특수 문서로 볼 수 있는 내용은 입력할 수 없습니다.
루아를 사용하는 틀에 {{루아}}를 붙여 주세요. 루아의 사용과 틀의 편집에 관한 의사소통에 도움을 줍니다. 그 틀은 아래와 같습니다:
<templatestyles src="Module:Message box/ambox.css"></templatestyles>
이 틀은 루아를 사용합니다.
|
분류:루아 틀에서 루아를 사용하는 틀을 모두 보실 수 있습니다.
- 특수기능:접두어찾기/모듈: - 루아 모듈 목록
- 특수기능:접두어찾기/모듈:연습장 - 루아 모듈 연습장 목록
- (영어) mw:Extension:Scribunto/Lua reference manual - 루아 레퍼런스 매뉴얼
