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++
- test.erlを開く(emacs test.erl)
- Erlang Shellを起動(C-c C-z)
- 接続するErlang nodeを指定(C-c C-d n masauki@localhost)
- Erlang Shell上で、debug_infoを付けてコンパイル
- source bufferに戻り、testモジュールをErlang nodeにロード(C-c C-d L)
- デバッガによる実行中断を可能にする(C-c C-d i)
- source bufferで、止めたい場所にブレークポイントを設定する(C-x space)
- Erlang Shell上で、関数を実行する
- ブレークポイントに到達すると、プロセスリストが表示されるので、デバッグを行うプロセスを選択する
- ブレークポイントを設定した場所で実行が停止し、対話的操作が可能となる
デバッガ起動後に指定可能なコマンドは、Clementson’s Blog: Distel = Emacs erlang-mode++を参考にしてください。特に、3.で.emacsに”-sname”を付けて定義したプロセス名@localhostを指定すること、4.で
c(test, [debug_info]).
を付けてコンパイルすること、6.で実行中断を可能にする必要があるあたりは注意が必要です。
Conclusion
今回はErlangの開発環境の構築を行いました。ちょっとしたことをパっと試せる環境が、あるのとないので向かう気持ちも変わるので、Erlang modeとDistelを使い込んでみたいと思います。