Luaを使ってみた時の備忘録

スクリプト言語Luaを初めて触ってみたので、メモ。

# Luaのダウンロード
[http://www.lua.org/](http://www.lua.org)

# Lua統合開発環境
[Lua Development Tools(LDT)](http://www.eclipse.org/koneki/ldt/)

# Lua の文法

```lua:tutorial.lua
-- ハイフンを２つ書くと1行コメントになる

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

-- 標準出力への改行付き出力
print("Hello, world!")

-- 標準出力への改行なし出力
io.write("Hello, world!")
io.write("Hello, everyone!")

-- 改行のみ
print()

-- 値には型があるが、変数には型がない
a = 1


-- リテラルは大文字小文字が区別される
ab = 1
aB = 2
AB = 3
print(ab, aB, AB)


-- 多重代入可能
a,b = 1,2
print(a,b)

-- 値のスワップも簡単
a,b = b,a
print(a,b)


-- 四則演算 + - * /
-- 剰余　%
-- べき乗 ^
x = 10
y = 3

z = x ^ y
print(z)

z = x % y
print(z)

-- 文字列
s1 = "ダブルクォートの中にダブルクォートを書くには\\でエスケープが必要\"こんな感じで\""
print(s1)

s2 = 'シングルクォートの中にシングルクォートを書くには\\でエスケープが必要\'こんな感じで\''
print(s2)

s3 = 'タブとか\t改行も\n書けまっせ'
print(s3)

-- 文字列の連結は「..」演算子
a = 1
print("a="..a)

--ヒアドキュメント
s = [[複数行文字列も
こうやって
代入可能]]
print(s)

s4 = [[この記号で囲むと、エスケープ\tシーケンスも\nそのまま表示されます]]
print(s4)


-- テーブル（配列／連想配列）
-- 添字は1から始まる

-- テーブル（配列 的使い方）
a = {1,2,3,"Hello, World!"}
print(a[1])
print(a[2])
print(a[3])
print(a[4])

-- 要素の個数 #
print(#a)

-- テーブル（連想配列 的使い方）
users = {name="Bob", age = 18}
print(users["name"], users["age"])
print(users.name, users.age)

-- 条件分岐 if
-- 偽：false nil
-- 真： (上記以外)	
score = 70
if score > 60 then
	print("score > 60")
elseif score > 40 then
	print("score > 40")
else
	print("score <= 40")
end

-- 関係演算子 < > >= <= == ~=(否定)
-- 論理演算子 or and not 
score = 75
if score > 40 and score < 100 then
	print("ok!")
end

-- 繰り返し while
i = 0 
while i < 10 do
  print(i)
  i = i + 1
end

print()

-- 繰り返し repeat
i = 0
repeat
	print(i)
	i = i + 1
until i >=10

print()

-- ループ脱出 break
i = 0 
while i < 10 do
  print(i)
  i = i + 1
  if i > 4 then
    break
  end
end

print()

-- 繰り返し for
for i=0, 9 do
	print(i)
end
	
print()

-- 繰り返し for 増分あり
for i=0, 9, 2 do
	print(i)
end
	
print()

-- 繰り返し for テーブル(順番と値)
a = {12,24,"hey"}
for i, value in ipairs(a) do
	print(i, value)
end

print()


-- 繰り返し for テーブル(キーと値)
users = {name="Bob", age = 18}
for key, value in pairs(users) do
	print(key, value)
end

print()


-- 関数 引数・返り値なし
function greet()
	print("Hello!")
end

greet()

-- 関数 引数・返り値あり
function multi(x,y)
	return x * y
end

print(multi(12,10))

-- 複数の値を返すことも可能
function calc4(x,y)
	return x + y, x - y, x * y, x / y
end

a,b,c,d = calc4(12,4)
print(a,b,c,d)

print() 

-- local宣言しないと、関数内で宣言された変数もグローバル変数になるので注意
g = 1
function test()
	local g = 2
	print(g)
end

test()
print(g)

print()

-- 可変長引数
function sum(...)
	local args = {...}
	local total = 0
	for i = 1, #args do
		total = total + args[i]
	end
	return total
end

print(sum(1,2,3,4,5,6))

print() 

 
-- 数値関数
print(math.min(1,2,3))
print(math.max(1,2,3))

print(math.ceil(2.1))
print(math.floor(2.1))

print(math.random()) -- 0 ~ 1 の実数
print(math.random(100)) -- 0 ~ 100 の整数
print(math.random(20,800)) -- 20 ~ 800 の整数

print()

-- 文字列関数
s = "Hello, world!"
-- 文字列長
print(string.len(s))
print(#s)

-- 部分文字列
print(string.sub(s,3,5))

-- 検索
print(string.find(s, "wor"))

-- 置換
print(string.gsub(s, "w", "W"))

-- 大文字化/小文字化
print(string.upper(s))
print(string.lower(s))

-- 逆順
print(string.reverse(s))

-- 文字列フォーマット
x = 10
y = 21.111
name = "Mike"
s = string.format("name:%s x:%10d y:%f", name, x, y)	-- 右寄せ
print(s)

s = string.format("name:%s x:%-10d y:%f", name, x, y)	-- 左寄せ
print(s)

s = string.format("name:%s x:%010d y:%f", name, x, y)	-- 0埋め
print(s)

-- テーブル操作

-- ソート
a ={2, 25, 42, 1}

table.sort(a)
for i, v in ipairs(a) do
	print(v)
end
print()

-- 挿入
a ={2, 25, 42, 1}

table.insert(a,"last")

for i, v in ipairs(a) do
	print(v)
end

table.insert(a,4, "foo")

for i, v in ipairs(a) do
	print(v)
end
print()

-- 削除
a ={2, 25, 42, 1}

table.remove(a,3)

for i, v in ipairs(a) do
	print(v)
end
print()

-- 日付・時刻
-- 基準日からの秒数
t = os.time()
print(t)

-- システム日時
t = os.date()
print(t)

t = os.date("%Y-%m-%d")
print(t)

-- システム日時の各要素をテーブルで取得
t = os.date("*t")
for key,value in pairs(t) do
  print(key,value)
end
print()


```