MacにElixir開発環境を構築する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

MacへのElixirインストール方法とEmacsのElixir設定手順をまとめてみようと思います。
EmacsにはAlchemistという強力なElixir開発サポートツールがあるので、設定と簡単な使用方法を書きます。
(私は普段Emacsを使っているため、エディタの設定はEmacsについてのみ書きます。ご了承ください。)

Elixirのインストール

homebrewでインストールします。

$ brew install erlang
$ brew install elixir

特に複数バージョンのElixirを使う要件がなければこれだけで終わりです。homebrew便利ですね。

version毎のインストール

rubyのrbenvみたいな複数バージョンのElixirを使いたい場合はexenvをinstallします。

$ brew install erlang
$ brew install elixir-build
$ brew install exenv

インストールできたらパスを通します。使用しているシェルに合わせて書き込むファイルを変えてください。

$ echo 'export PATH="$HOME/.exenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(exenv init -)"' >> ~/.bash_profile
$ exec $SHELL

パスを通したら以下のコマンドでElixirをインストールできます。

$ exenv install -l # installできるversion確認
$ exenv install 1.2.5
$ elixir -v
Erlang/OTP 18 [erts-7.2.1]  [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.2.5

REPL

ElixirにはiexというREPLが用意されています。
このiexを使ってRubyのpryのようにデバッグをすることもできます。
以下ように対象のファイルにrequire IExと記述してから、ブレイクポイントを貼る場所にIEx.pryと記述します iex2

そしてiexを起動して対象のプログラムを実行します。pryを許可するか聞かれるので許可します。 iex3

新しく立ち上がったiex上では、ブレークポイントを張ったプログラムのコンテキストなので変数の中を確認することができます。

iex4

Editorの設定

emacsの設定方法を書きます

シンタックスハイライト

syntax-highlightはelixir modeを入れると実現できます。 M-x package-install [RET] elixir-mode [RET]でインストールしてください。 インストールしたら.init.elに(require 'elixir-mode)と書いてください。

自分はcaskを今だに使っているので.emacs.d/Caskファイルに(depends-on "elixir-mode")と記述してcaskコマンドでインストールしました。

コード補完

Screen Shot 2016-05-23 at 17.04.55

alchemistという拡張を入れると、コード補完のほかEmacs上でREPLを起動することができます。 非常に強力なツールなので、Emacsを使っている方は是非インストールしましょう。
elixir-modeと同じようにM-x package-install [RET] alchemist [RET]でインストールして、.emacs.d/init.elに(require 'alchemist)と書いてください。

alchemistのコード補完はcompany-modeが使われていますが私はauto-completeを普段使っているので、alchemistでもauto-completeを使用できるようにします。
M-x package-install [RET] ac-alchemist [RET]でインストールして、.emacs.d/init.elに(add-hook 'elixir-mode-hook 'ac-alchemist-setup)と記述すればauto-completeが使用できるようになります。
以下のようにコード補完ができるようになります。

Screen Shot 2016-05-23 at 16.09.06

Emacs上でREPLを起動

alchemistを入れるとElixirのREPLをエディタ上に起動することができます。
C-c a i iとemacs上で入力するとこのようにREPLが起動します。 iex1-1

現在の行をREPLで評価することもできます。C-c a i lと入力します。 alchemist3

マークしているリージョンを評価するにはC-c a i bと入力してください。 alchemist4

コードを書いている時に少し動作を確認したくなった時に便利な機能ですね。
この他にもたくさんコマンドが用意されています。興味のある方は以下のページを参照してください。
Alchemistのドキュメント

Phoenix開発のサポート

ElixirのWebフレームワークといえばPhoenixが有名ですが、alchemistを入れるとPhoenixプロジェクトの開発をサポートする便利なコマンドが使えるようになります。
例えば、Controllerのファイルを開く場合、C-c a n cと入力して開くファイルを選択すると

alchemist5

選択したファイルがEmacs上で開かれます alchemist6

ルーティングの設定を確認したい場合はC-c a n Rと入力します。 alchemist7

その他にもたくさんのコマンドが用意されています。

キーバインド 内容
C-c a n c Controllersディレクトリのファイルを開く
C-c a n m Modelsディレクトリのファイルを開く
C-c a n v Viewsディレクトリのファイルを開く
C-c a n w Webディレクトリのファイルを開く
C-c a n t Templateディレクトリのファイルを開く
C-c a n r router.exファイルを開く

サンプルコード

せっかく環境構築したので、プログラムを実行してみましょう。
Elixirは大量リクエストを捌くことのできる並列処理で知られている言語なので複数プロセスを使うプログラムを試します。
以下はPrograming Elixirに書いてあるサンプルコードです。
少し複雑に見えますが、やっていることは100万プロセス立ち上げて、数宇を1インクリメントしてその結果を次のプロセスに渡しインクリメントを繰り返すことを100万プロセスで実行しています。

defmodule Chain do
  # 各プロセスが実行する関数です、数値をインクリメントして次のプロセスに渡します
  def counter(next_pid) do
    receive do
      n ->
        send next_pid, n + 1
    end
  end

  # ここで100万プロセス立ち上げます
  def create_processes(n) do
    last = Enum.reduce 1..n, self,
    fn (_, send_to) ->
      spawn(Chain, :counter, [send_to])
    end

    # ここから開始します、初期値は0です
    send last, 0

    # and wait for the result to come back to us
    receive do
      final_answer when is_integer(final_answer) ->
        "Result is #{inspect(final_answer)}"
    end
  end

  def run(n) do
    IO.puts inspect :timer.tc(Chain, :create_processes, [n])
  end
end

これを私のマシン(MacBookPro 3.1GHz, Core i7, 16GB RAM)で実行すると

$ elixir --erl "+P 1000000" -r chain.exs -e "Chain.run(1_000_000)"
{7315073, "Result is 1000000"}

結果は7秒ちょっとですね、さすがです!

まとめ

Elixirはまだ若い言語ですが、開発者コミュニティが非常に活発です。開発環境もたくさんのツールが用意されているので簡単に開発を始められます。
興味がある方は是非Elixirを使ってみてください。