Erlangのコマンド引数
プログラミングErlangを見ながらちょっとお勉強.サンプルを打ち込んでみたのだけど,なんかうまく動かない...ちょっと調べてみたところ,コマンドラインから実行する2つの方法でプログラムにわたる型が違うことが判明.
という二つの方法がある.が,この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 の位置づけは?
#!/usr/bin/env escript
を行頭につけ,スクリプトを chmod +x しておくことでスクリプトを実行可能にすることができる.しかしこのときはこのときで,なんか知らんが,またちょっと挙動が違う.
- この行を付け加えるとerlcコンパイラに通らなくなる.#はerlではコメントではないので,当たり前と言えば当たり前.
- この行を付けた場合には,module文,export文は削除する必要があるようだ.redefining moduleエラーがでる.
つまり,一つのスクリプトを書いておいて,さまざまな実行方式で使い分けることはできないということだ.なんなんだ.
ようするに,escriptは使うな,ということなのだろうか.