elixirはプログラマの万能薬になるか

erlang/OTP界隈でreiaというrubyフレーバーの言語が開発されて以来、erlang/OTP上で動作する言語がいくつか開発されている(efene, LFE(Lisp Flavoured Erlang)など)。どれも、erlang/OTPの独特な機能である、並行性、動的アップグレード、対障害性などをもっと、「普通の」言語から利用したいという要求だろう。
elixirはそんな中、reiaのすぐ後に独立して開発され、reiaの後継プロジェクトに指定された歴史を持つ。
当初はreiaと同様にrubyフレーバーの言語とオブジェクトシステムを持っていたが、2011年末の0.4-devから大胆に仕様変更を行い、全く別のものとなった。

特徴

近代的なシンタックス
ruby風味なので、Prologチックなerlangに比べて取っ付きやすくなっている。
強力なメタプログラミング機能
homoiconic 構文を持つため、elixriプログラムはelixirのデータ構造として表現される。lispのような強力なマクロ機構により、コンパイル後の構文木をプログラムからいじることができる。ここがerlangはじめ他の関数型言語と一線を画するところ。なお、homoiconic languageとしてはlisp系が有名だが、それ以外にもfactorというスタックベースの言語が存在する。
erlangランタイムとの相互運用
erlang/OTPの膨大なライブラリ資産をそのまま呼び出すことができる。Java VM上で動作するscalajavaのクラスライブラリを呼び出すことができるのと似ている。

ひとことでまとめると、erlangの並列/高信頼フレームワークが利用できるrubyライクの構文を持つlispといえる。

ビルド

elixirはerlang/OTPのバージョン15Bかそれ以降が必要なので、www.erlang.orgからダウンロードしてインストールしておく。erlang/OTPのインストール後、elixirをビルド・インストールする。

$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir
$ make test
$ bin/elixir -v
Elixir 0.4.0.dev 

インストールには /usr/local/lib/erlang/libにこれらをコピーまたは移動し、パスを通す。

$ mv elixir /usr/local/lib/erlang/lib/elixir-0.4.0
$ echo 'PATH=/usr/local/lib/erlang/lib/elixir-0.4.0/bin:$PATH'  >> ~/.bashrc

Hello, world.

elixirの構造は以下のとおり。

defmodule ModuleName do
	def MethodName(arg1, arg2,...) do
		body
	end
	def ShortMethod(arg1), body
end
ModuleName.MethodName(arg1, arg2,...) %% start point

rubyなどを知っていれば受け入れやすい文法と構造になっている。では最初のプログラムを書いてみよう。Erlang/OTPはErlangモジュールにまとめられているので、そこからio.format/2を呼び出す形になる。

defmodule Hello do
 def world do
  Erlang.io.format("Hello, world.~n", [])
 end
end
Hello.world

これをhello.exsとして保存し、elixirへ渡すと実行される。

bash-3.2$ elixir hello.exs
Hello, world. 

同様の事は対話環境であるiexを使ってもできる。

air:elixir_doc k-1$ iex
Interactive Elixir (0.4.0.dev) - press Ctrl+C to exit
Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]

iex> defmodule Hello do
...> def world do
...>  Erlang.io.format("Hello, world~n", [])
...> end
...> end
{:world, 0}
iex> Hello.world
Hello, world
:ok
iex> 

今回はココまで。
次回は、構文とメタプログラミングについて記述予定。