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 では
nilとfalseのみが「偽」と判定される。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 系の資料は方言が一致しないため案内しない。
- 日本語 Lua リファレンスマニュアル(Lua 5.2 相当): http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html
- 日本語 Lua リファレンスマニュアル(Lua 5.1): http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html
- LuaJIT 公式サイト: https://luajit.org/
- LuaJIT 言語拡張(Lua 5.2 互換機能・
goto等): https://luajit.org/extensions.html
これらのリンクは 外部リンク集 にもまとめてある。
ね、案外コンパクトでしたでしょう? これだけ押さえれば、Pasta のスクリプトはもう怖くありませんわ。 次は、ランタイムがあなたのために用意した便利な道具箱――公開モジュールを開けてまいりましょう。