ソフトバンククリエイティブ品田様より、打ち合わせのついでに献本いただいた。

LuaめんこいよLua。

こんな小さいのに、こんなに出来る子だなんて。

ブラジル生まれのこの言語は、もっともっと知られて、もっともっと使われてるべきだ。

本書「入門Luaプログラミング」は、タイトルどおりLuaプログラミングの入門書なのだが、Perlでこれに相当するのはリャマ本ではなくラクダ本。Pythonならネズミ本ではなくヘビ本だ。そう。本書にはLua 5.1に搭載されている機能がすべて紹介されているのだ。250ページしかないのに。

目次 - ソフトバンク クリエイティブの本:入門Luaプログラミングより
■第1部 Luaを使ってみよう
第1章 はじめの一歩
第2章 処理の流れ
第3章 部品を作ろう
第4章 何ができるの
■第2部 Luaならこうなる
第5章 Luaでデータを整理
第6章 リーグ戦の集計
第7章 Luaの仕組み
第8章 カーナビに挑戦
■第3部 Luaをカスタマイズ
第9章 Luaを拡張してみる
第10章 Luaのモダンな機能
第11章 C言語との連携
第12章 Luaの組込み

なんでそんな芸当が可能なのか?

Luaが、あまりにコンパクトだからだ。

そのソースコードは、Perl/Ruby/Pythonより二桁小さい。二桁だ。一桁ではない。現代のプログラミング言語のソースコードは、tarballで10MBのオーダーだが、Luaのそれは、最新の5.1.4でもわずか211.6KB。本blogのトップページのHTML程度なのである。

それでいて、現代的なスクリプト言語が備えているべき機能は、ほぼ全て揃っている。tableによる配列と連想配列、クロージャー。そしてmetatableによるOO。逆に、Luaを見ることで、現代的なプログラミング言語に何が必要なのかもよくわかる。

論より証拠。実際に動かしてみてもらおう。まずはFizzBuzzを少し大げさに書いてみた。

fizzbuzz = (function()
  local fizzbuzz = { -- table は JavaScript の object 相当
    fizz = { [0] = "Fizz" }, -- [0]がないとfizz[1] = "Fizz"
    buzz = { [0] = "Buzz" }, -- luaの配列は1から始まるので
  }
  return function(n) -- クロージャーも使える
    local fizz = n % 3
    local buzz = n % 5
    if fizzbuzz.fizz[fizz] then
      if fizzbuzz.buzz[buzz] then
         -- .. で文字列連結
        return fizzbuzz.fizz[fizz] .. fizzbuzz.buzz[buzz]
      else
        return fizzbuzz.fizz[fizz]
      end
    else
      if fizzbuzz["buzz"][buzz] then
        return fizzbuzz["buzz"][buzz]
      else
        return n
      end
    end
  end
end)()

for i=1,30 do
  -- evalはloadstringで string を function にしてから
  local f = loadstring("print(fizzbuzz(" .. i .. "))") 
  f() -- 実行する。JSの new Funcion()とほぼ同じ
end

「とんがった」ところは、配列が0からではなく1から始まるぐらいのものではないか。それですら、JavaScriptと同じく「配列も連想配列もどちらもtable」なので、上のようにすればarray[0]を使うことができる。

ざっとやってみた私の感想は、「LuaはJavaScriptの文法をPascal的にして、プロトタイプを省いた代わりにメタテーブルを持つ言語」というものである。そうそう。メタテーブルの紹介がまだだった。これはテーブルに「隠し属性」を持たせることによって、テーブルの機能を拡張するというものである。JavaScriptの__noSuchMethod__みたいな感じだ。

論より証拠。これも実際に見てみよう。

fibs = { 1, 1 }
setmetatable(fibs, {
  __index = function(name, n)
    name[n] = name[n - 1] + name[n - 2]
    return name[n]
  end
})

for i=1,69 do print("fibs[" .. i .. "] = " ..fibs[i]) end

ちょっとすごくないだろうか。配布物が200KBしかない言語にこれだけのことが出来るなんて。

もちろん、Luaがコンパクトなのにはわけがある。一つは、言語の機能は豊富でも語彙はそうではないこと。ライブラリーは基本的なもののみで、それだけでWebプログラミングがいきなり出来たりすることはない。利発だがまだ知識も経験もない子どものような感じだ。

それもそのはず。Luaは組み込み言語として開発されてきた。他のスクリプト言語のように、言語に機能を追加するのではなく、機能=アプリケーションに言語を追加するのがLuaなのだ。World of Warcraft のメインの機能は"fun"であって"code"ではない。Adobe Photoshop Lightroomもしかり。他の言語に組み込むことすら容易で、例えばPerlにはInline::Luaがすでに存在する。

Luaはポルトガル語で「月」。 月のように控えめで衛星的な言語なのである。

率直に言って、Luaで大規模プロジェクトを作りたいとは思わないし、それはLua的ではないと思う。そういう使い方をするには、Luaはあまりにめんこい。しかしその大規模プロジェクトの中にDSLが必要になったとき、わざわざDSLを作るぐらいならLuaを組み込んでしまった方がよいのではないか。

それでも、メタテーブルは素敵すぎる。これを使った「フルボディ」のLuaが欲しくなるほど。そのようなものがあるとしたら、名前はやはりTerraになるのだろうか。

こんなめんこい子も、日本語であまり紹介されていなかったためそれほど知られていなかったが、本書でそれも変わるだろう。プログラマーなら一度は付き合ってみるべきです end

Dan the Polyglot