2

嗨,我正在学习 Erlang,在此过程中,我正在尝试从Erlang execises 页面进行练习。特别是我正在做的问题是,我必须创建一个函数,该函数创建两个进程,将 M 消息发送给另一个进程,然后死掉。我遇到了麻烦,这是我的代码:

-module(roundtrip).
-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    if M =:= 0 ->
        io:format("Bye cruel world!~n")
    end,
    receive
        {From, a_message} ->
            From ! {self(), a_message},
            myProc(M-1);
        _ -> 
            io:format("I don't understand~n"),
            myProc(M)

    end.

start(M) ->
    spawn(?MODULE, myProc, [M]).

当我打电话给谈话时,我得到以下错误:

=错误报告==== 2013 年 11 月 11 日::21:21:00 === 进程 <0.46.0> 出错,退出值:{undef,[{roundtrip,proc,"\n",[] }]}

=错误报告==== 2013 年 11 月 11 日::21:21:00 === 进程 <0.47.0> 出错,退出值:{undef,[{roundtrip,proc,"\n",[] }]}

我正在解决它,但我无法弄清楚是什么问题......

谢谢。

4

2 回答 2

3

您需要导出myProc/1功能。或者您可以使用spawn/1

start(M) ->
   spawn(fun() -> myProc(M) end).
于 2013-11-11T22:34:05.070 回答
3

由于您使用spawn/3您需要导出myProc.

另一个问题是您的 if 条件不涵盖 when 的另一种可能性M =/= 0。我会这样做:

-module(roundtrip).

-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    case M of
        0 ->
            io:format("Bye cruel world!~n");
        _ ->
            receive
                {From, a_message} ->
                    From ! {self(), a_message},
                    io:format("~p ~p~n", [self(), M]),
                    myProc(M-1);
                _ ->
                    io:format("I don't understand~n"),
                    myProc(M)

            end
    end.

start(M) ->
    spawn(fun() -> myProc(M) end).

请注意,我使用case了代替ifspawn/1代替spawn/3.

于 2013-11-11T22:35:16.123 回答