TOPシステム開発> 【新・言語進化論】次にくる!新登場言語> 第2回:言語開発者が目標にするパフォーマンス「Lua」 (2/3)

【新・言語進化論】次にくる!新登場言語

【新・言語進化論】次にくる!新登場言語

第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では配列要素の列挙やファイル入力、パターンマッチなどの標準関数でイテレータが使用されている。また関数を持ち運べる特徴とテーブル(連想配列)を組み合わせてオブジェクト指向プログラミングを行うことも可能だ。 次のページ




ether
著者プロフィール
著者: ether
プログラミングを嗜む普通の社会人。はじめてのプログラミングは「Hello World」ではなく、N88-BASICで画面上に円を描いたこと。「外国語のよいところはそれをいくつ学ぼうと構わないことだ」という或る言語学者の言葉はプログラミング言語にも当てはまると最近感じ始めている。
http://blog.so-net.ne.jp/rainyday/


INDEX
第2回:言語開発者が目標にするパフォーマンス「Lua」
  Luaについて
Luaの基本構文でFizzBuzz
  Luaと他言語