|
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)
リスト2:generic for文で書き換えた例
function upto (max)
イテレータとクロージャ Luaには「数値をカウントアップするfor文(numeric for)」の他に「関数をとるfor文(generic for)」が存在する。このfor文では与えられた関数を繰り返すごとに呼びだす。これを使うことで、fizzbuzz関数は同じだが「リスト1」を「リスト2」のように書き換えることができる。 ここで使っている「upto関数」は上限値maxを引数にとって「戻り値として関数を返す」関数だ。Luaはこのように名前の無い関数を作りだし、引数や戻り値として「持ち運び」できるという特徴を持つ。 upto関数内のcount変数とmax変数のスコープはupto関数の終わりまでだが、uptoの戻り値である関数から参照されているため、スコープを抜けた後も寿命は続いていく。 このような性質を持つ関数を「クロージャ」と呼ぶ。またgeneric forの中で使われる関数を特に「イテレータ」と呼ぶ。Luaでは配列要素の列挙やファイル入力、パターンマッチなどの標準関数でイテレータが使用されている。また関数を持ち運べる特徴とテーブル(連想配列)を組み合わせてオブジェクト指向プログラミングを行うことも可能だ。 |
||||||||||
|
||||||||||
|
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||

