2

コードによって生成されるエラーは次のとおりです。

2> X = "2".
"2"
3> case_:main(X).
main 50
sender 50
** exception error: bad argument
     in function  case_:sender/1 (case_.erl, line 14)
     in call from case_:main/1 (case_.erl, line 6)
4> Z = 2.
2
5> case_:main(Z).
** exception error: bad argument
     in function  io:format/3
        called as io:format(<0.25.0>,"main ~p~n",2)
     in call from case_:main/1 (case_.erl, line 5)
6> 

最初の試行では、整数を渡す2回目の試行よりもはるかに遠くなる文字列を渡そうとしました。なぜこれが機能しないのかわかりません。

関数呼び出しは、関数呼び出しからsender(Input)戻る必要があります。{Data}receiver()

メッセージを受け取り、それらを評価して結果を返すループを作成しようとしているので、プログラムのメッセージパッシング部分が絶対に必要です。しかし、おそらくcase...ofステートメントは破棄される可能性があります。

-module(case_).
-export([main/1, sender/1, receiver/0]).

main(Input) ->
    io:format("main ~p~n",Input),
    case sender(Input) of
        {Data} ->
            io:format("Received ~p~n",Data)
    end.

sender(Input) ->
    io:format("sender ~p~n",Input),
    Ref = make_ref(),
    ?MODULE  ! { self(), Ref, {send_data, Input}},
    receive
        {Ref, ok, Data} ->
            {Data}      
    end.    

receiver() ->
    io:format("receiver ~n"),
    receive
        {Pid, Ref, {send_data, Input}} ->
            Pid ! { Ref, ok, Input + Input} 
    end.
4

1 に答える 1

4

幸い、badargの修正は簡単に行えます。io:format/22番目の引数として用語のリストを取ります。見る:

(Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
1> io:format("main ~p~n", 2).
** exception error: bad argument
     in function  io:format/3
        called as io:format(<0.24.0>,"main ~p~n",2)
2> io:format("main ~p~n", [2]).
main 2
ok

2番目の問題は?MODULE、現在のモジュール名のアトムを返すだけです。メッセージをプロセスに送信する必要があります。次のようにコードを変更した場合:

-module(case_).
-export([main/1, sender/2, receiver/0]).

main(Input) ->
    io:format("main ~p~n", [Input]),
    Recv = spawn(?MODULE, receiver, []),
    case sender(Recv, Input) of
        {Data} ->
            io:format("Received ~p~n", [Data])
    end.

sender(Pid, Input) ->
    io:format("sender ~p~n", [Input]),
    Ref = make_ref(),
    Pid ! { self(), Ref, {send_data, Input}},
    receive
        {Ref, ok, Data} ->
            {Data}
    end.

receiver() ->
    io:format("receiver ~n"),
    receive
        {Pid, Ref, {send_data, Input}} ->
            Pid ! { Ref, ok, Input + Input}
    end.

次に、replでの相互作用:

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.2  (abort with ^G)
1> c("case_").
{ok,case_}
2> case_:main(2).
main 2
sender 2
receiver 
Received 4
ok
于 2013-03-21T02:55:05.203 に答える