编写一个程序来产生一个新进程,该进程接收X一个整数并返回X+1,如果一个非整数消息以erlang?

eimct9ow  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(159)

我是Erlang的新手,我已经完成了代码,但是我需要正确的答案格式来回答这个问题。这是我的代码。如果我输入了任何整数,那么它必须给那个数字加1。如果给出了字符或浮点数或任何其他非整数,它应该退出这个过程。

-module(a).
-export([start/0,func1/1]).

func1(List) when is_integer(List) -> io:format("~p~n",[List+1]);
func1(List) when is_atom(List) -> io:format("Exit~n");
func1(List) when is_binary(List) -> io:format("Exit~n");
func1(List) when is_list(List) -> io:format("Exit~n");
func1(List) when is_map(List) -> io:format("Exit~n");
func1(List) when is_float(List) -> io:format("Exit~n").

start() ->
     spawn(a, func1, [45]),
     spawn(a, func1, [test]).

这段代码工作正常,但我需要这样做,在乒乓格式的东西像接收和结束像传递消息。请让我知道正确的答案,并提前感谢。
下面是我看了评论后的尝试。

-module(a).
-compile(export_all).

f1() ->
    receive
        List ->
            io:format("~p~n", [List+1]);
        _ ->
            io:format("Exit~n")
    end.

f2() ->
    receive
        {From, List} ->
            From ! "~p~n" ,[List+1];
        _ ->
            io:format("Exit~n")
    end.

f3() ->
    receive
        {From, List} ->
            From ! "~p~n" , [List+1],
            f3();
        _ ->
            io:format("Exit~n"),
            f3()
    end.
1qczuiv0

1qczuiv01#

首先,你不必为每一个非整数类型定义一个函数子句。关键是要意识到函数子句是按顺序测试的。你的第一个函数子句测试参数是否是整数。这意味着如果erlang到达你的第二个函数子句,那么你就知道参数不是整数--不需要做任何类型检查。所以,对第二个函数子句中的所有非整数参数执行您需要执行的操作。
其次,当自变量可以是整数、原子、元组、二进制等时,将自变量命名为List是没有意义的。
这段代码工作正常,但我需要以乒乓格式来做这件事,比如接收和结束,比如传递消息。
然后,您需要启动另一个进程,而不向它发送任何参数,然后使另一个进程进入递归循环/函数。在递归循环/函数中,您需要的唯一语句是receive statement,它将暂停,直到收到消息。
主进程可以使用send()向其他进程发送消息。您需要定义一个用户函数,如increment_number(Number)。在increment_number(Number)中,您将调用send()向其他进程发送消息,然后下一个语句将是receive,它将等待来自其他进程的返回消息。
我是非常新的Erlang,所以我不知道对不起。
所有开始Erlang编程的书籍都告诉你如何创建多个相互对话的进程。我推荐"编程Erlang"--阅读关于并发的相关章节。
您将不得不花费很多很多小时来阅读基本的并发示例,玩它们,然后尝试将它们改编为自己的使用。
下面是我看了评论后的尝试。
通常,消息作为元组传递,例如

send(OtherProcessPid, {self(), increment, 3})

或者,等同地:

OtherProcessPid ! {self(), increment, 3}

然后,另一个进程在receive子句中匹配消息:

receive
    {Sender, increment, Number} ->

在执行完某个任务后,接收进程需要向发送进程返回一条消息,即包含某个算术计算结果的消息。而且,因为您希望接收进程能够处理不确定数量的消息和后续计算,所以您希望创建一个无限循环。在erlang中,您可以使用递归函数来实现这一点:

loop() ->
    receive
       {Sender, increment, Number} -> 
          %% do stuff, e.g. send(Sender, Number+1)
          loop();
       {A, B} ->
          %% do stuff
          loop();
        quit  -> quitting  %%no recursive call, so function ends
    end.

相关问题