Erlang IDE

前回のポストからかなり時間が経ちましたが、少し時間ができたので、暫くErlangで遊んでみようと思います。

Erlangの開発環境ですが、いくつかある中で、EmacsのErlang modeにするか、EclipseのErlideにするか迷いました。検討した結果、コンパイルの仕方等から覚える為に、今回はErlang modeを使うことにしました。

Setting for Erlang mode

Erlangをインストール後、.emacsファイルを開き、Erlangのtoolsディレクトリの下の.elファイルを読み込むようにします。

.emacs:

1;; erlang-mode                                                                                     
2(setq load-path (cons  "/opt/erlang/lib/erlang/lib/tools-2.6.10/emacs"
3      load-path))
4      (setq erlang-root-dir "/opt/erlang/otp")
5      (setq exec-path (cons "/opt/erlang/otp/bin" exec-path))
6      (require 'erlang-start)

Compile And Run On Erlang Shell

.emacsへの設定が終わったら、簡単なコードを書いてみます。

test.erl:

1-module(test).
2-export([hello/1]).
3
4hello(1)   ->
5  io:format("argument 1\n");
6hello(2)   ->
7  io:format("argument 2\n");
8hello(Msg) ->
9  io:format("~p~n", [Msg]).

C-c C-zでErlang Shellのバッファが起動します。Erlang Shellのバッファに移動して、c(モジュール名).でコンパイルし、コンパイルしたモジュールの関数を呼び出します。

(masayuki@localhost)1> c(test).
{ok,test}
(masayuki@localhost)2> test:hello(1).
argument 1
ok
(masayuki@localhost)3> test:hello(2).
argument 2
ok
(masayuki@localhost)4> test:hello("foo").
"foo"
ok

Distel

馴れない言語でコードを書く時には予めデバッガを準備しておきたい方なので、Erlang modeでデバッグする方法を探してみたところ、DistelというErlang modeの拡張ライブラリを見つけました。

DistelはEmacsからErlang nodeに対して対話的に操作する為のインターフェースを提供します。デバッガも、Erlang nodeをデバッグする形になっています。デバッガの他にも、任意の関数の定義にジャンプする等のナビゲーション機能や、プロファイラも使えるようです。

Install Distel

Distelは現在githubにあるので、そこから落としてきてインストールします。makeの際にerlを実行するので、予めパスを通しておく必要があります。デフォルトでは/usr/local/share/distelにインストールされます。

$ export PATH=$PATH:/opt/erlang/bin
$ make
$ make -e install

インストールが完了したら、.emacsに以下の設定を追加します。

.emacs:

 1;; distel
 2(add-to-list 'load-path "/usr/local/share/distel/elisp")
 3(require 'distel)
 4(distel-setup)
 5
 6;; Some Erlang customazations
 7(add-hook 'erlang-mode-hook
 8  (lambda ()
 9    (setq inferior-erlang-machine-options `("-sname" "masayuki"))
10    (imenu-add-to-menubar "imenu")))

.erlファイルを開いた際に、モードの表示が”Erlang EXT”になれば準備OKです。

Distel’s debugger

先ほどのtest.erlに対してDistelを使ってデバッグしてみます。デバッガの起動に関しては、以下のページを参考にしました。

Clementson’s Blog: Distel = Emacs erlang-mode++

  1. test.erlを開く(emacs test.erl)
  2. Erlang Shellを起動(C-c C-z)
  3. 接続するErlang nodeを指定(C-c C-d n masauki@localhost)
  4. Erlang Shell上で、debug_infoを付けてコンパイル
  5. source bufferに戻り、testモジュールをErlang nodeにロード(C-c C-d L)
  6. デバッガによる実行中断を可能にする(C-c C-d i)
  7. source bufferで、止めたい場所にブレークポイントを設定する(C-x space)
  8. Erlang Shell上で、関数を実行する
  9. ブレークポイントに到達すると、プロセスリストが表示されるので、デバッグを行うプロセスを選択する
  10. ブレークポイントを設定した場所で実行が停止し、対話的操作が可能となる

デバッガ起動後に指定可能なコマンドは、Clementson’s Blog: Distel = Emacs erlang-mode++を参考にしてください。特に、3.で.emacsに”-sname”を付けて定義したプロセス名@localhostを指定すること、4.で

c(test, [debug_info]).

を付けてコンパイルすること、6.で実行中断を可能にする必要があるあたりは注意が必要です。

Conclusion

今回はErlangの開発環境の構築を行いました。ちょっとしたことをパっと試せる環境が、あるのとないので向かう気持ちも変わるので、Erlang modeとDistelを使い込んでみたいと思います。