2011-12-13 2 views
5

UNIXコマンドラインから1より大きいarity関数を実行するにはどうすればよいですか?コマンドラインから1より大きいarity関数を持つerlangプログラムを実行する方法

プログラム例:

-module(test). 
-export([sum/2]). 
sum(X,Y)->io:write(X+Y). 

erlc test.erlをコンパイルした後、私は

ERL -noshell -sテストのようなものをしようとしています合計5 3 -s初期停止

が、それはリストとして5 3を扱いますので、明らかにそれが動作しないようなので...

答えて

5

は、リストを取る関数を作成します。

-module(test). 
-export([sum/2, start/1]). 

start(Args) -> 
    % Pick X and Y args out of Args list and convert to integers 
    sum(X, Y). 
sum(X, Y) -> io:write(X+Y). 

今すぐあなたのコマンドラインリストを開始関数に渡すと、リストを破棄して合計を行います。注:これはテストしていませんが、引数をリストとして取得する場合にはうまくいくはずです。

+0

コマンドラインでの使用のために、 'start'と呼ぶ必要はないことに注意してください。' sum([X、Y]) - > sum(X、 Y).'そして 'sum/1'としてエクスポートします(必ずしも' sum/2'バージョンをエクスポートする必要はありません)。 Erlangの初心者として私にはすぐには分かりませんでした。 – atomicules

3

名前付き関数が1つの引数をとるという要件を回避する方法については気づいていません。 Codyが言及しているように、その1つの引数はリストにすることができます。リストはパラメータリストの定義で削除できます。

は、あなたが与えたコマンドラインを使用して、これは私の作品:

-module(test). 
-export([sum/1]). 

sum([X, Y]) -> 
    io:format("X: ~p Y: ~p", [X, Y]), 
    list_to_integer(atom_to_list(X)) + list_to_integer(atom_to_list(Y)). 
+0

私はリストから整数を選択するよりエレガントな方法がなければならないことを知っていました。ありがとう! :) – Cody

+0

これは非常に一般的なケースではありません。 –

+0

実際には、パラメータの2つの要素のリストを想定しているため、そうではありません。元の質問と一致し、このアプローチの一般化は簡単です。何をお勧めしますか? – Ben

4

Youcanではなく-evalスイッチを使用します。

erl -eval 'io:format("~p",[hello]).' 
関連する問題