Coronaで遊ぶためにLuaを学ぶ

『入門Luaプログラミング』を読みながら、Lua勉強中です。CoronaLuaを採用していて、きちんと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