【新・言語進化論】次にくる!新登場言語
第2回:言語開発者が目標にするパフォーマンス「Lua」
著者: ether
公開日:2007/11/12(月)
Luaの基本構文でFizzBuzz
「Luaのコードがどのようにみえるか」をつかんでもらうため、LuaでFizzBuzzプログラムを記述してみた。
Luaのコードはインタプリタに打ち込んで実行する他、ファイルに保存してスクリプトとして動かすことができる。「リスト1」のコードを「fizzbuzz.lua」というファイル名で保存し、コマンドラインから「lua5.1 fizzbuzz.lua」と入力することで実行できる。
本記事で取り上げたLuaの文法は次のようなものだ。関数は「function [関数名] (仮引数, …) ブロック end」、条件分岐は「if 条件 then ブロック [elseif 条件then ブロック [else ブロック]] end」、そして反復は「for 変数=初期値,上限値[,ステップ] do ブロック end」と「for 変数 in 関数 do ブロック end」(次節で説明)となっている。
リスト1:LuaによるFizzBuzzプログラム
function fizzbuzz(n)
if n % 15 == 0 then
return "FizzBuzz"
elseif n % 3 == 0 then
return "Fizz"
elseif n % 5 == 0 then
return "Buzz"
else
return n
end
end
for i=1,100 do
print(fizzbuzz(i))
end
リスト2:generic for文で書き換えた例
function upto (max)
local count = 0
return function ()
if count < max then
count = count + 1
return count
end
end
end
for i in upto(100) do
print(fizzbuzz(i))
end
イテレータとクロージャ
Luaには「数値をカウントアップするfor文(numeric for)」の他に「関数をとるfor文(generic for)」が存在する。このfor文では与えられた関数を繰り返すごとに呼びだす。これを使うことで、fizzbuzz関数は同じだが「リスト1」を「リスト2」のように書き換えることができる。
ここで使っている「upto関数」は上限値maxを引数にとって「戻り値として関数を返す」関数だ。Luaはこのように名前の無い関数を作りだし、引数や戻り値として「持ち運び」できるという特徴を持つ。
upto関数内のcount変数とmax変数のスコープはupto関数の終わりまでだが、uptoの戻り値である関数から参照されているため、スコープを抜けた後も寿命は続いていく。
このような性質を持つ関数を「クロージャ」と呼ぶ。またgeneric forの中で使われる関数を特に「イテレータ」と呼ぶ。Luaでは配列要素の列挙やファイル入力、パターンマッチなどの標準関数でイテレータが使用されている。また関数を持ち運べる特徴とテーブル(連想配列)を組み合わせてオブジェクト指向プログラミングを行うことも可能だ。 次のページ