elixirはプログラマの万能薬になるか
erlang/OTP界隈でreiaというrubyフレーバーの言語が開発されて以来、erlang/OTP上で動作する言語がいくつか開発されている(efene, LFE(Lisp Flavoured Erlang)など)。どれも、erlang/OTPの独特な機能である、並行性、動的アップグレード、対障害性などをもっと、「普通の」言語から利用したいという要求だろう。
elixirはそんな中、reiaのすぐ後に独立して開発され、reiaの後継プロジェクトに指定された歴史を持つ。
当初はreiaと同様にrubyフレーバーの言語とオブジェクトシステムを持っていたが、2011年末の0.4-devから大胆に仕様変更を行い、全く別のものとなった。
特徴
- 強力なメタプログラミング機能
- homoiconic 構文を持つため、elixriプログラムはelixirのデータ構造として表現される。lispのような強力なマクロ機構により、コンパイル後の構文木をプログラムからいじることができる。ここがerlangはじめ他の関数型言語と一線を画するところ。なお、homoiconic languageとしてはlisp系が有名だが、それ以外にもfactorというスタックベースの言語が存在する。
- erlangランタイムとの相互運用
- erlang/OTPの膨大なライブラリ資産をそのまま呼び出すことができる。Java VM上で動作するscalaがjavaのクラスライブラリを呼び出すことができるのと似ている。
ビルド
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>
今回はココまで。
次回は、構文とメタプログラミングについて記述予定。