Erlang,寄存器/2:异常错误错误参数错误

Erlang,寄存器/2:异常错误错误参数错误,erlang,Erlang,我想写一个创建两个进程的程序。 第一个打印号码,将其发送到第二个进程,依此类推。 但是我在启动功能上有问题 -module(zad). -export([start/0, one/0, two/0]). one() -> receive {go1, N} -> io:format("1 ~w~n", [N]), two ! {go2, N+1}, one(); {go2

我想写一个创建两个进程的程序。 第一个打印号码,将其发送到第二个进程,依此类推。 但是我在启动功能上有问题

-module(zad).

-export([start/0, one/0, two/0]).

one() ->
    receive
        {go1, N} ->
            io:format("1 ~w~n", [N]),
            two ! {go2, N+1},
            one();
        {go2, 50} ->
            io:format("END ~w~n", [N+1]),
            two ! finished
    end.

two() ->
    receive
        finished ->
            io:format("two finished~n", []);
        {go2, N} ->
            io:format("2 ~w~n", [N]),
            one ! {go1, N+1 },
            two()
    end.

start() -> 
    register(two, spawn(zad, two, [])),
    register(one, spawn(zad, one, [])),
    one ! {go1, 0}.
这是错误

** exception error: bad argument
 in function  register/2
    called as register(two,<0.146.0>)
 in call from zad:start/0 (zad.erl, line 29)

错误消失了。
这真的很奇怪,因为问题出在
one()
,而错误出在
寄存器(二)
您可以在
start/0
中注册两个进程。这意味着传递到
寄存器/2
的值是错误的。从文档()中:

失败:

  • badarg
    如果PidOrPort不是现有的本地进程或端口
  • badarg
    如果RegName已在使用
  • badarg
    如果进程或端口已经注册(已经有名称)
    badarg
    如果RegName是atom
    未定义的

很可能发生的情况是,在调用
register/2
之前,进程已死亡(请参阅上面列表中的第一个失败)。

您可以在
start/0
中注册两个进程。这意味着传递到
寄存器/2
的值是错误的。从文档()中:

失败:

  • badarg
    如果PidOrPort不是现有的本地进程或端口
  • badarg
    如果RegName已在使用
  • badarg
    如果进程或端口已经注册(已经有名称)
    badarg
    如果RegName是atom
    未定义的

很可能是在调用
register/2
之前进程就死了(请参见上面列表中的第一个失败)。

可能
two/0
中也有语法错误?也许
two/0
中的一个更改没有被编译,当您为
one/0
重新编译时,它被更正了?您尝试运行了多少次?如果第二次运行时未注销名称,则在尝试重新注册名称时会出现错误,因为该名称已在使用中。可能在
two/0
中也存在语法错误?也许
two/0
中的一个更改没有被编译,当您为
one/0
重新编译时,它被更正了?您尝试运行了多少次?如果第二次运行时未注销名称,则在尝试重新注册名称时会出现错误,因为该名称已在使用中。
{go2, 50} -> io:format("END ~w~n", [N+1]),
{go2, 50} -> io:format("END ~w~n", [50]),