2013-03-21 172 views
2

由代码生成的误差Erlang:case..of构造函数调用返回?

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> 

在第一次尝试我试图通过这使得它有很多比更远的第二次尝试传递一个整数的字符串。我不知道为什么这不起作用。

函数调用sender(Input)应该从receiver()函数调用中返回{Data}

我绝对需要程序的消息传递部分,因为我试图编写一个需要消息的循环,对它们进行评估并返回结果;但也许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

令人高兴的是,badarg修复很容易完成。 io:format/2将术语列表作为第二个参数。请参阅:

(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 

你的第二个问题是,?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