위키百科 : 루아

위키百科, 우리 모두의 百科事典.
위키百科 이름空間
基本 이름空間 討論 이름空間
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
假想 이름空間
-1 特需
-2 미디어
v  ?  d  ?  e  ?  h
現在 目錄 (API 呼出)

루아 는 위키百科에서 모듈을 製作할 때 使用할 수 있는 프로그래밍 言語입니다. 루아 코드는 모듈 :Bananas 처럼 모듈 이름空間에 貯藏됩니다. 모듈 機能은 미디어위키의 Scribunto 擴張 機能을 통해 具現되었으며 現在 루아 言語만 支援하고 있습니다.

모듈은 文書에서 Scribunto의 機能 中 하나인 {{#invoke:모듈 이름|函數 이름|...}} 文法을 利用하여 한 番의 呼出마다 1個의 函數씩 使用할 수 있습니다. [1]

모듈 實行하기 [ 編輯 ]

모듈은 모듈 이름空間을 除外한 모든 이름空間에서 {{#invoke:모듈 이름}} 을 使用하여 實行할 수 있습니다. 媒介變數로 준 入力값들을 基盤으로 處理한 結果값을 받을 수 있다는 點에서 {{틀 이름}} 文法으로 이 動作하는 方式과 {{#invoke:모듈 이름}} 文法으로 모듈이 動作하는 方式은 비슷합니다. 하지만 몇 가지 差異點이 있는데, 그 中 代表的인 差異點은 모듈을 使用하고자 할 땐 使用하려는 하는 모듈 안 ‘函數 이름’을 적어줘야 한다는 點입니다. 여기서 ‘ 函數 ’의 意味란 값들을 入力받아 處理한 後에 그 結果값을 返還하는 命令文들을 모아놓은 것을 말합니다. [2] 또 다른 差異點으로는 1個의 틀 文書에는 1個의 틀만 定義할 수 있는 反面, 1個의 루아 모듈 文書에는 여러 個의 函數를 定義할 수 있다는 點입니다. [3]

그뿐만 아니라 單獨으로 使用할 수 있는 틀과는 달리 루아 모듈은 그 自體만 가지고는 直接 實行할 수 없으며 한 番의 invoke 黨 하나의 函數만 實行할 수 있다는 差異點도 있습니다. 모듈은 函數들을 모아놓은 것에 不過하며 모듈 自體로는 아무것도 하지 못합니다. [4] 結局 루아 엔진이 모듈을 불러왔을 때 函數 이름을 記載하지 않은 境遇 모듈 그 自體를 實行할 수 없는데다 모듈 안의 函數 中에서 어떤 函數를 實行해야 할 지 모르기 때문에, 모듈을 使用하고자 할 땐 使用하려는 函數 이름을 같이 넣어주어야 합니다.

위키 文書에서 모듈을 實行하는 가장 簡單한 方法은 다음과 같습니다.

{{#invoke:모듈 이름|函數 이름}}

例를 하나 들자면, 모듈:Bananas 에 있는 "hello"란 이름을 가진 函數는 아래의 構文과 같은 方式으로 實行할 수 있습니다.

  • {{#invoke:Bananas|hello}} → Hello, world!

媒介變數 使用하기 [ 編輯 ]

媒介變數는 틀에 傳達되는 方式과 同一한 方式을 利用하여 모듈에 傳達됩니다. 하지만 注意해야 할 것이 있는데, 첫 番째 數直線 文字 ( | )의 뒤에 位置해야 하는 것은 반드시 函數 이름이여야 하며, 모듈로 傳達될 첫 番째 媒介變數는 두 番째 垂直線 文字( | )의 뒤에 位置해야 한다는 것입니다.

{{#invoke:모듈 이름|函數 이름|첫 番째 變數|두 番째 變數|變數 이름=값}}

例를 몇個 들자면, 모듈:BananasArgs 의 " hello " 函數는 다음의 코드처럼 첫 番째 媒介變數에 따라 서로 다른 사람들에게 人事합니다.

  • {{#invoke:BananasArgs|hello|西燕}} → 安寧하세요, 서연님!
  • {{#invoke:BananasArgs|hello|민준}} → 安寧하세요, 민준님!

또한 BananasArgs엔 바나나 謝過 란 (이름을 가진) 媒介變數를 使用하여 使用者가 가지고 있는 바나나 謝過 의 個數를 入力받는 " count_fruit "란 函數가 存在하며 다음과 같이 動作합니다.

  • {{#invoke:BananasArgs|count_fruit|謝過=3|바나나=4}} → 저는 바나나 4個와 沙果 3個를 가지고 있습니다.
  • {{#invoke:BananasArgs|count_fruit|바나나=5|謝過=2}} → 저는 바나나 5個와 沙果 2個를 가지고 있습니다.

大部分의 모듈은 使用할 수 있는 媒介變數들과 그 媒介變數들이 어떤 役割을 하는지를 잘 說明한 說明文書를 가지고 있습니다.

예제 모듈 [ 編輯 ]

  • 모듈:Bananas : 가장 簡單한 構文으로, 媒介變數가 없는 函數 하나를 提供합니다.
  • 모듈:BananasArgs : 變數에 接近하여 使用하는 方法을 說明합니다.

도움 要請 [ 編輯 ]

루아를 利用해서 틀을 만드는데 도움을 얻고 싶다면 위키百科討論:루아 위키百科:舍廊房 (技術) 에 要請을 남겨 주세요.

루아 紹介 [ 編輯 ]

Brad Jorsch's short presentation for a basic example of how to convert a wikitext template into a Lua module (PDF) 도 參考하세요

루아는 資料를 分析하고, 數式을 計算하며, 函數와 客體志向 프로그래밍 을 使用한 結果를 棲息化하는 스크립트 言語 입니다. 어떤 루아 스크립트는 簡單하지만, 票, 動的 函數, 聯關 配列 을 使用해서 컴퓨터 科學者 들에게 興味를 끌 程度로 複雜한 構文도 만들 수 있습니다.루아는 函數를 再歸的으로 使用할 수 있기 때문에 다른 使用者들이 모듈을 編輯하는데 混亂을 줄 程度로 複雜하게 만들어서는 안됩니다. 아래는 모듈:HelloWorld 에서 볼 수 있으며 "hello" 函數를 만드는 소스코드입니다:

-- 위키百科의 모든 모듈은 테이블 變數를 定義해주는 것부터 始作해야 합니다.

-- 이 變數는 모듈 外部에서 接近하는 函數들이 이 모듈을 쓸 수 있게끔 해줍니다.

my_object
 =
 {};


-- 테이블 變數에 函數를 追加합니다. 函數를 쓸땐 #invoke 命令語로 쓸수 있습니다.

-- "frame"엔 위키百科에서 函數를 呼出했을 때 같이 傳達된 데이터(媒介變數 等)가

-- 包含되어 있을 것입니다.

my_object
.
hello
 =
 function
(
 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/testcases | run_tests}} 式으로 實行시킵니다. 또한 테스트 메소드의 이름은 반드시 " test "로 始作해야 합니다. 아래는 모듈:Bananas/試驗場 에서 가져온 簡單한 例題입니다.

-- [[모듈:Bananas]]의 테스트 케이스입니다. 테스트를 하려면 '討論'을 클릭하세요.

local
 p
 =
 require
(
'Module:UnitTests'
)


function
 p
:
test_hello
()

    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]

루아 入力 制限 [ 編輯 ]

Scribunto 루아 코드는 文書를 解釋할 때에만 實行됩니다. 그러므로 使用者 入力은 文書를 編輯함으로써만 할 수 있습니다. 키보드로 數値를 入力 받아 제곱根을 求하는 函數를 만들 수도 없고, 만델브로 集合의 一部分을 마우스로 클릭하면 그 部分을 다시 計算해서 보여주는 函數를 만들 수도 없습니다. 루아 入力은 틀처럼 包含할 수 있는 文字列 文書 [8] 를 담을 수 있지만, 그림 파일, [9] 分類 文書에 보이는 文書의 目錄, 또는 위키百科:特需 文書로 볼 수 있는 內容은 入力할 수 없습니다.

루아 틀 標示하기 [ 編輯 ]

루아를 使用하는 틀에 {{ 루아 }}를 붙여 주세요. 루아의 使用과 틀의 編輯에 關한 意思疏通에 도움을 줍니다. 그 틀은 아래와 같습니다:

分類:루아 틀 에서 루아를 使用하는 틀을 모두 보실 수 있습니다.

各州 [ 編輯 ]

  1. 例로 들어 모듈:Bananas/說明文書 에선 "Hello, world!"를 出力하기 위해 {{#invoke:Bananas|hello}} 코드를 使用하고 있습니다.
  2. 여러 個의 結果값을 返還할 수도 있지만 그런 函數들은 一般的으로 위키 文書에서 잘 쓰이지 않습니다.
  3. 하지만 어떤 루아 모듈엔 函數가 한 個도 없을 수 있으며, 이런 모듈은 當然히 一般 文書에서 使用할 수 없으며 특수한 用途로 使用됩니다.
  4. 하지만 例外的인 境遇가 있는데, 다른 모듈에게 自身이 가진 變數의 값을 提供할 目的으로써 函數없이 미리 定義된 값을 담은 變數들만 가진 境遇도 있을 수 있습니다.
  5. 代表的인 것은 ~~~~ 文字列을 署名으로 變換하는 것입니다.
  6. 출력된 文書의 소스 코드를 調査하면 틀이나 모듈을 處理하는데 얼마의 時間이 걸렸는지 알 수 있습니다.
  7. 이에 對하여 (英語) mw:Extension:Scribunto/Lua reference manual#Differences from standard Lua 를 參照하십시오.
  8. 틀과 같이 {{ }}안에 담을 수 있는 文書들을 말합니다.
  9. SVG 파일은 實際로는 文字列이지만, 文字列로 된 文書에 內容을 複寫해 오지 않으면 入力할 수 없습니다.

함께 보기 [ 編輯 ]