Erlnagをコマンドラインから実行するスクリプト(あるいはターミナルから実行)

最近Erlangのコードを書いてるんだけど、いちいちEShellを立ち上げてコンパイルするのが面倒になってきたのでmake / Erlang Worldを参考にしてMakefileを作ってみた。リンク先のMakefileにcleanコマンドを追加するなどちょこっと変えてある。

.SUFFIXES:  .erl .beam
.erl.beam:
        erlc $< > $@

SOURCES = $(wildcard *.erl)
PROGS = $(SOURCES:.erl=.beam)

all: $(PROGS)

clean:
        rm -f *~ *.beam

でもって実行のほうもコマンド一発で出来るようにしようと考えたのだが、これがなかなか面倒だった。

Erlnagはスクリプト言語なのでRubyPythonなんかと同じく普通にターミナルから実行できると思ったら大間違いで、どうやらEshellを立ち上げないと実行できないらしい。(yawsやらはどうやって動かしてるのだろう…)なので、メモ代わりに使わせてもらってます。を参考にモジュールとメソッド名を打ち込むだけで自動実行するスクリプトを組もうとしたら、これがなかなかうまくいかなかった。*1実際よくシェルスクリプトを理解してないので、諦めてrubyで作ろうと思っていたところでErlang Tipsからもっと簡単な書き方を発見。これを元に次のコードを書いてやっと思い通りの開発環境が構築できた。

#!/bin/bash                                                                  
erl -noshell -eval "io:format(\"~p~n\", [$1]),halt()."

上のコードをexecute.shなど名前をつけて保存し、実行権限をつければ用意は万端。
まずmake clean, makeとしてbeamファイルを作成し、

make clean
make

次にexecute.shに呼び出したいメソッド名を書けば実行できる。(エントリメソッドの返り値もio:formatせずに表示される)

./execute.sh main:main\(\)

この際メソッドの括弧をエスケープすることを忘れずに。これにハマって二十分無駄にした。バックスラッシュが美しくないと言う方は次のようにダブルクォーテーションで囲めばよい。

./execute.sh "main:main()"

それにしても、Erlangをターミナルから呼び出すのになぜこんなに手間がかかるのだろう?

*1:後々考えたら、どうやらエントリメソッドの出力が標準出力に表示されてなかっただけで、実行自体は正常にできていたようだ。しかし、リンク先のコードのままでは結果が表示されず、スクリプト側で画面に出力しなければならないので結局次の方法が最短距離だったようである