Coronaで遊ぶためにLuaを学ぶ
『入門Luaプログラミング』を読みながら、Lua勉強中です。CoronaでLuaを採用していて、きちんとLuaを勉強してみようと思いました。Luaはとてもシンプルな言語です。コルーチンが使えるのもいいですね。
Emacsを使っている場合、C-c C-l(Send Buffer)でプログラムの実行結果が別バッファに表示されて便利です。
はじめはHello worldから。
print("Hello world!")
実行結果です。
Hello world!
フィボナッチ数列を求める関数を定義して、if文、for文の使い方を学びます。
-- n番目のフィボナッチ数を求める function fib(n) if n == 0 or n == 1 then return 1 else return fib(n-1) + fib(n-2) end end function main() for i = 0, 5 do print(string.format("fib(%d) = %d", i, fib(i))) end end main()
行コメントは -- です。-- から行末までがコメントとなります。
実行結果です。
fib(0) = 1 fib(1) = 1 fib(2) = 2 fib(3) = 3 fib(4) = 5 fib(5) = 8
Luaの配列はインデックスが 1 から始まります。これは普段 C や Java などに使い慣れていると、うっかりミスしてしまうかもしれません。
local ary = { 32, 98, -123 } for i = 1, #ary do -- #aryで配列サイズを取得 print(ary[i]) end
実行結果です。
32 98 -123
配列を使う練習のために、エラトステネスのふるいのアルゴリズムを実装して素数を求めてみます。
-- エラトステネスのふるいで n 以下の素数を求める function seive(n) local xs = {} for i = 1, n do xs[i] = true -- 全て素数として初期化 end xs[1] = false for i = 2, n do if i*i > n then break end if xs[i] then -- iは素数 for j = i+i, n, i do xs[j] = false -- 素数ではない end end end local p = 1 local primes = {} for i = 1, n do if xs[i] then primes[p] = i p = p + 1 end end return primes end primes = seive(100) print(table.concat(primes, " "))
少し驚いたのですが、Luaにはcontinue文がありません。continue文がなくてもプログラムは書けると思いますが、どんな感じがするだろうか。たぶん、continue文を補うために if 文を設けて実行するしないの制御をすることになるはず。
実行結果です。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97