Erlangのコマンド引数

プログラミングErlangを見ながらちょっとお勉強.サンプルを打ち込んでみたのだけど,なんかうまく動かない...ちょっと調べてみたところ,コマンドラインから実行する2つの方法でプログラムにわたる型が違うことが判明.

コマンドラインからErlangのプログラムを起動するには,

という二つの方法がある.が,この2つでは,コマンド引数の型が,それぞれatomとlistになるようだ.

-module(argtest).
-export([main/1]).

main([A]) ->
    if
        is_atom(A) ->
            io:format("atom\n");
        is_list(A) ->
            io:format("list\n");
        true ->
            io:format("unknown\n")
    end,
    init:stop().

こんなプログラムをargtest.erlとしてセーブしておいて,まずは
コンパイルして実行してみる.最後の4が引数.

$ erlc argtest.erl
$ erl -noshell -s argtest main 4
atom

atomになっていることが分かる.これに対して,escriptを使うと,こんな感じ.

$ escript argtest.erl 4
list

listになる.ちなみに,本のなかのサンプルは,atomになる前提で書かれている.

escript の位置づけは?

escript は普通のスクリプトインタプリタのように,

#!/usr/bin/env escript 

を行頭につけ,スクリプトを chmod +x しておくことでスクリプトを実行可能にすることができる.しかしこのときはこのときで,なんか知らんが,またちょっと挙動が違う.

  • この行を付け加えるとerlcコンパイラに通らなくなる.#はerlではコメントではないので,当たり前と言えば当たり前.
  • この行を付けた場合には,module文,export文は削除する必要があるようだ.redefining moduleエラーがでる.

つまり,一つのスクリプトを書いておいて,さまざまな実行方式で使い分けることはできないということだ.なんなんだ.

ようするに,escriptは使うな,ということなのだろうか.