NScripterの深淵

NScripter/NSLua/Lua5.1/関連プログラム

▼メニュー

ゴブリンでもわかるNSLua/Lua5.1 第2回:Lua5.1入門 変数の四則演算

前二稿で、「Lua自体のチュートリアルをこなせばNScripterLuaを扱える」状態になった。本稿ではLuaチュートリアルに進む。

(……実のところ、Lua5.1それ自体のチュートリアルは公式のガイドブックが一番親切で分かりやすい。都道府県単位なら一冊くらいは在庫があるはずなので、紙の本に抵抗がない人はもうこのページ閉じて地元の図書館に取り寄せ予約を出す方がよい。)

それはそれとして、まずは「NScripterの延長で理解できる変数定義/四則演算」から。

変数の宣言、代入、四則演算

~以下、system.lua内に記述されている前提~

--「--」で始まる行は注釈・コメントアウト
--NScripterの「;」に相当する

--[[
    複数行をまとめてコメントアウトできる
    便利。
    --[=[
        入れ子にもできる
        とても便利。
    --]=]
--]]

--変数は好きな場所でいきなり定義してよい(代入が定義・宣言を兼ねる)
aaa=1
--変数名の大文字・小文字は区別される。大雑把だった人は注意
AAA=2

--複数の変数をまとめて定義・代入してよい
bbb,ccc=1,2

--命令間の区切りはスペースさえ空いていればよい
--(Luaが自動で解釈してくれる)
bbb=1 ccc=2
--もし明示したければ「;」で区切ってもよい
bbb=1;ccc=2;

--四則演算+-*/の扱いはNScripterと変わらない
aaa=(1+2-3*4)/5

--ただしmod(剰余、割った余り)は「%」で表す
aaa=10 % 3 -->1

--累乗は「^」で表す 3^2なら3の2乗
aaa=3^2

--根号(√)は0.5乗で表せる
aaa=3^0.5

--右辺に変数を書いてもよい
aaa=aaa+1

--文字列は 「""」または「''」で括る
ddd="12345"  --コメントは行末にも書ける

--文字列の結合は「..」で行う。+ではないので注意
eee="あいう".."えお"

--数字もそのまま結合できる
fff="123"..45

--ただし、数字の直後に「..」を書く際はスペースを空ける必要がある
--めんどいね
ggg=123 .. "45"
--小数点と結合を明確に区別するための仕様である
--Luaにおける「数値」は常に小数点以下(浮動小数点)を扱う
hhh=3.14
ggg=3/2 -->ggg=1.5

上記例ではLuaならではの便利機能が(複数行コメントアウト程度しか)見えず、NScripter側とやり取りする手段も含まれない。これだけでは何も始まらないが、とりあえず「基本的な言語仕様はNScripterと比べても別に複雑ではない」とさえ理解できれば十分だろう。

ifとfor

ifは複数行にまたがって書ける点、そして「elseif」「else」の存在が大きな相違箇所。NScripterでifとjumpfなりを延々組み合わせていたような判定はスマートに書けるようになる。

forは「指定回数ループするだけなら」NScripterとほぼ一緒。Luaならでのループは他にあるが、ここでは見てすぐ分かる回数ループのみ紹介する。

a="123"
b=456
c="789"

--if(判定)then
--    判定を満たす場合に実行する処理
--    複数行にまたがって書いてよい
--end

--「==」と書く必要がある。「=」はダメ
  if(a=="123")then
    --aは"123"である
  end
  if(b<=999)then
    --bは999以下である
  end


--「and」は&&に、「or」は||に相当する
  if(a=="123" and b==456)then
    --判定を満たした
  end
  if(a=="123" or b==456)then
    --判定を満たした
  end

--ややこしい判定は複数行にまたがって書いてもよい
  if(
    --内部に注釈も書ける。
    (a=="123" and b==456)
    or
    c=="789"
  )then
    --満たした
  end


--if(判定)then
--    満たす場合に実行する処理
--else
--    満たさない場合に実行する処理
--end
  if(a=="123")then
    --aは"123"である
  else
    --aは"123"ではない
  end


--if(判定1)then
--    判定1を満たす場合に実行する処理
--elseif(判定2)then --※判定1を満たさない場合のみ追加で判定
--    判定2を満たす場合に実行する処理
--else
--    全ての条件式を満たさなかった場合に実行する処理
--end
  if(a=="999")then
    --aは"999"である
  elseif(a=="123")then
    --aは"123"である
  else
    --aは"999"でも"123"でもない
  end


for i=1,10 do
    --10回繰り返す
    --「ループ回数は初回のみ計算する」という相違点もあるにはあるが、
    --NScripterユーザーは元々この仕様を意識していないので忘れてよい
end

for n=10,1,-1 do
    --見た目はNScripterとほとんど変わらない(A TO B STEP C)
end

(少なくとも基礎的な部分だけなら)NScripterとそこまで大きくは変わらない、おそるべき言語ではないと分かったかと思う。

次項ではNScripterでいう「命令」に相当する骨子、「関数」を紹介する。

--ダイアログが出現する
aaa="テスト"
NSOkBox(aaa,"テストです")