Lua

深さ優先探索によるトポロジカルソート

Lua

トポロジカルソートのアルゴリズムは、『プログラマのうちあけ話―続・プログラム設計の着想』を読んで学びました。この本では次の方法により、トポロジカルソートします。 入力辺がないノードをキュー q に入れる while (q に要素が含まれる): node = q.pop(…

LuaでPythonのrange関数のようなものを作る

Lua

Pythonのrange関数に似た関数をLuaで作成してみます。 function range(n) local i = 0 return function() if i >= n then return nil end local ret = i i = i + 1 return ret end end function main() for i in range(5) do print(i) end end main() 実行結…

zip関数

Lua

Luaでzip関数を作成してみました。 function zip(xs, ys) local i = 1 return function() x = xs[i] y = ys[i] if x and y then i = i + 1 return x, y else return nil end end end function main() for a, b in zip({1,2}, {3,4,5}) do print(a, b) end en…

Luaのlocal function

Lua

function main() function test() print("test") end test() end main() test() 実行結果です。 test testtestがmainの外側から見えてしまっています。関数内でローカル関数を定義する場合は、local functionを使います。 function main() local function te…

「失敗に学ぶこと」を読んで

Lua

失敗に学ぶことを読んで、Luaだとどうなるか確認してみます。 function main() local t = {} for i = 1, 3 do t[#t + 1] = function() print("call", i) end end for i = 1, #t do t[i]() end end main() 実行結果です。 call 1 call 2 call 3お、ちゃんと値…

テーブルのソート

Lua

function main() t = { "foo", "bar", "baz", "hoge" } print(table.concat(t, " ")) table.sort(t) print(table.concat(t, " ")) table.sort(t, function(a, b) return a > b end) print(table.concat(t, " ")) end main() 実行結果です。 foo bar baz hoge…

Luaの真偽値

Lua

Luaでは、falseとnilが偽となり、それ以外の値は全て真です。 function test(x) if x then print("true", x) else print("false", x) end end function main() tab = { -1, 0, 1, "", "string", {}, { 1 }, { test=2 }, main, true, false, } for i = 1, #ta…

Luaのgoto文

Lua

Lua 5.2からgoto文が入りました。 function main() for i = 1,10 do for j = 1,10 do if i == 1 and j == 3 then goto exit end print(i, j) end end print("end for loop") ::exit:: print("exit") end main() 実行結果です。 1 1 1 2 exit 参考: lua-users…

Luaのnilは型であり、その値はnilです。

Lua

Luaのnilは型であり、その値はnilです。 function main() print(nil) print(type(nil)) end main() 実行結果です。 nil nil

浮動小数点演算の誤差についての誤解

Lua

『Programming in Lua プログラミング言語Lua公式解説書』p.28ページより。 浮動小数点演算の誤差については広く誤解されており、浮動小数点数では単純に 1 を加算するだけでも悲惨な状況になると恐れている人もいます。実際のところは、倍精度浮動小数点数…

コルーチンの練習

Lua

コルーチンの練習です。 function main() co = coroutine.create(function() coroutine.yield(1) coroutine.yield(2) end) print(co) print(coroutine.status(co)) print(coroutine.resume(co)) print(coroutine.status(co)) print(coroutine.resume(co)) pr…

数値の表記が e を使ったものに切り替わるタイミング

Lua

2^i をプリントするプログラムを作成しました。 function main() for i = 1,50 do print(i, 2^i, type(2^i)) end end main() 実行結果です。 1 2 number 2 4 number 3 8 number 4 16 number 5 32 number 6 64 number 7 128 number 8 256 number 9 512 number…

Luaは末尾再帰の最適化を行う

Lua

Luaは末尾再帰の最適化を行うらしい。プログラムを書いて確かめてみる。 function add(n) if n == 0 then return 0 else return 1 + add(n-1) end end function addTCO(n, acc) if n == 0 then return acc else return addTCO(n-1, acc+1) end end function …

Luaの長さ演算子

Lua

長さ演算子は単項演算子 # で表される。文字列の長さはそのバイト数である (つまり、各文字が1バイトだとした場合の、文字列の長さである)。テーブル t の長さは、 t[n] が nil でなく t[n+1] が nil であるような整数 n と定義されている。また、t[1] が ni…

カレンダーを表示するプログラムを作成してテストする

Lua

Luaでカレンダーを表示するプログラムを作成してみます。その後で作成したプログラムのテストについて考えます。まずは、calコマンドでカレンダー表示の確認。 $ cal 3 2012 3月 2012 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19…

Coronaで遊ぶためにLuaを学ぶ

Lua

『入門Luaプログラミング』を読みながら、Lua勉強中です。CoronaでLuaを採用していて、きちんとLuaを勉強してみようと思いました。Luaはとてもシンプルな言語です。コルーチンが使えるのもいいですね。Emacsを使っている場合、C-c C-l(Send Buffer)でプログ…