Erlang始め

気になってたErlangの使い方を調べ始めた。基本的にはVM上で動く実装らしい*1。以下コンパイルとか実行関係のメモ。
erlコマンドで対話環境が開いていろいろできるのは当然として、そこから別ファイルに保存したモジュール*2コンパイル/ロードして実行できるらしい。そのへんはよく解説されてるが、別にコンパイルしてコマンドラインから直接実行するにはどうしたらええんやろう…と思ってドキュメントを斜め読み。

-module(hello).
-export([main/0]).

main()->io:put_chars("Hello, World!").

というのをhello.erlとすると、

$ erlc hello.erl

でhello.beamとかいうバイトコンパイルされたファイルが出来る。そのあと

$ erl -noshell -s hello main -s init stop

とかすると、実行されるような気がする。-noshellが対話環境なしの指定で、-sが起動時に実行するモジュールとその関数とその引数(つまりエントリポイントみたいなやつ)の指定。この場合、helloがモジュール名、mainが関数名、引数はなし。関数を指定しないとstart/0が指定されたことになるらしい。最後に-s init stopとかしてるのはこうしないと終了しないため(よくわかってない)。

あと一々コンパイルしてられるか、とかスクリプト書きたいんだよ、という向きにはescriptコマンドが使えるらしい。

$ escript hello.erl

とかすると、main/1関数から動く。1引数関数なんで、最初に挙げたソースでは動かない。main()をmain(_)とかにして、exportを書換えるとか、start()とmain(_)をちゃんと別々に書くとかなんとかすればいいか。mainの引数には、コマンドライン引数をリストにしたものが渡されるらしい。

一応対話環境からコンパイル/ロードするには、erlコマンドで環境を立ち上げて、

1> c(hello).
{ok,hello}
2> hello:main().
Hello, World!ok

とかすればよろし。

golfで一通り問題解いてみようかと思ったら、どうもexec禁止の規制にひっかかる。erlコマンドを実行するだけで10回くらいexecが出てるっぽいんで、sendページの判定に条件を追加して回避した。

*1:HiPEという、VMからネイティブコードを呼出す機能もあるらしい。

*2:プログラムは1モジュール1ファイル。モジュール名はコード中で指定するが、ファイル名と一致していないとマズいようだ。