Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Lua の基礎

「プログラミングなんて初めて」――そんなあなたでも大丈夫。安心なさいまし。 Lua はとても小さく、覚えることの少ない言語ですの。ここでは Pasta のスクリプトを読み書きするのに 必要な最低限だけを、わたくしがつまんでお見せいたしますわ。完璧を目指す必要はございません。 ……フンッ、別にあなたが心配だから言っているわけではなくてよ。


この章は Lua そのものの最小限の入口である。網羅的な言語仕様は外部リファレンス(後述)に譲り、 ここでは Pasta のスクリプトを読むために知っておきたい要点だけを扱う。

前提: Pasta ランタイムの Lua 方言は LuaJIT 2.1(言語仕様は Lua 5.1 系相当)である。 本章のコードもこの方言に従う。Lua 5.2 以降で追加された構文・標準関数は前提にしない。

変数とローカル宣言

変数はデフォルトでグローバルになる。意図しないグローバル汚染を避けるため、原則として local を付けて ローカル変数として宣言する。

local name = "ぱすた"   -- ローカル変数(推奨)
local count = 0
greeting = "こんにちは"  -- local なしはグローバル変数(原則避ける)

代入されていない変数の値は nil(値が無いことを表す特別な値)になる。

基本の型

Lua 5.1 系の主な型は次の通り。

説明リテラル例
nil値が無いことを表すnil
boolean真偽値true, false
number数値(整数・小数の区別なし、内部は倍精度浮動小数点)42, 3.14
string文字列"text", 'text'
table連想配列・配列・オブジェクトを兼ねる唯一の複合型{1, 2, 3}, {key = "value"}
function関数(値として扱える)function() end

注意: Lua では nilfalse のみが「偽」と判定される。0 や空文字列 "" は「真」である点に注意。

文字列

文字列はダブルクォートまたはシングルクォートで囲む。連結には .. 演算子を使う。

local who = "ぱすた"
local message = "こんにちは、" .. who .. "さん"  -- "こんにちは、ぱすたさん"
print(#message)  -- # は文字列のバイト長(UTF-8 では「文字数」ではない点に注意)

Pasta の辞書・スクリプトはすべて UTF-8 で扱う。日本語文字列はバイト単位で複数バイトを占めるため、 #str は文字数ではなくバイト長を返す。

テーブル

テーブルは Lua で唯一の複合データ構造であり、配列としても連想配列としても使える。

-- 配列的な使い方(インデックスは 1 始まり)
local fruits = { "りんご", "みかん", "ぶどう" }
print(fruits[1])  -- "りんご"(Lua の配列は 1 始まり)

-- 連想配列的な使い方
local actor = { name = "ぱすた", age = 17 }
print(actor.name)     -- "ぱすた"
print(actor["age"])   -- 17(actor.age と同義)

Lua の配列インデックスが 1 始まりである点は、多くの言語と異なるので特に注意する。

制御構文

-- 条件分岐
if count > 0 then
    print("正の数")
elseif count == 0 then
    print("ゼロ")
else
    print("負の数")
end

-- 数値 for(1 から 5 まで)
for i = 1, 5 do
    print(i)
end

-- テーブルの反復(ipairs: 配列、pairs: 全要素)
for index, value in ipairs(fruits) do
    print(index, value)
end

-- while ループ
local n = 3
while n > 0 do
    n = n - 1
end

等値比較は ==、非等値は ~=!= ではない)を使う。

関数

関数も値であり、変数に代入したりテーブルのフィールドにしたりできる。Pasta のシーン関数や イベントハンドラは、いずれもこの「テーブルのフィールドに関数を代入する」形を取る。

-- 名前付き関数
local function add(a, b)
    return a + b
end

-- テーブルのフィールドに関数を代入(Pasta で多用する形)
SCENE.挨拶 = function(act)
    -- ...
end

コメント

-- 1 行コメント

--[[
  複数行コメント
]]

外部リファレンス(LuaJIT 2.1 / Lua 5.1 系)

より詳しい言語仕様は、対象方言に対応した次の資料を参照する。本マニュアルは言語仕様を取り込まず、 リンク参照のみとする方針である。版の離れた Lua 5.5 系の資料は方言が一致しないため案内しない。

これらのリンクは 外部リンク集 にもまとめてある。


ね、案外コンパクトでしたでしょう? これだけ押さえれば、Pasta のスクリプトはもう怖くありませんわ。 次は、ランタイムがあなたのために用意した便利な道具箱――公開モジュールを開けてまいりましょう。