Erlang 并发编程

Posted

技术标签:

【中文标题】Erlang 并发编程【英文标题】:Erlang concurrent programming 【发布时间】:2021-05-26 10:03:59 【问题描述】:

编写一个不带参数的名为calculator 的Erlang 函数。该函数在进程中运行时应该等待接收消息。如果消息是四项元组的形式: Pid, Operand, X, Y ,请执行以下操作:

如果 Operand 为 add,则向 Pid 发送一条消息,其中包含 X 和 Y 相加的结果。 如果操作数是减法,则向 Pid 发送一条消息,其结果是从 X 中减去 Y。 如果操作数是乘法,则向 Pid 发送一条消息,其中包含 X 和 Y 相乘的结果。 如果操作数是除法,则向 Pid 发送一条消息,其中包含 X 除以 Y 的结果。

然后,重新运行该函数。

如果消息是一个元组的形式,有两个项目: Pid, terminate ,然后向完成的 Pid 发送消息。不要重新运行该函数。

如果消息是任何其他形式,忽略它并重新运行函数。

我的代码:

calculate() ->
  receive
    Pid, Operand, X, Y 
      if 
         Operand == "add" -> Pid ! X+Y
         Operand == "substract" -> Pid ! Y - X
         Operand == "multiply" -> Pid ! X*Y
         Operand == "divide" -> Pid ! X/Y
    Pid, terminate -> Pid ! "done"
    _ -> calculate();
  end.

有人可以帮我解决这个问题吗?

【问题讨论】:

您应该查看帮助以更友好的方式编辑和格式化您的问题。 【参考方案1】:

您的代码无法编译,您应该先看看基本的 erlang 语法。

我给你一些线索:

您不应该使用if 语句来解决您的问题,而是使用模式匹配代替

receive
    From,add,X,Y ->
        From ! X+Y,
        calculate();
    From,sub,X,Y -> 
    ...

通常,为此,请使用 add 之类的原子,而不是 "add" 之类的字符串

你应该有一个函数来在一个单独的进程中启动函数calculate/0

start() ->
    spawn(fun() -> calculate() end).

【讨论】:

以上是关于Erlang 并发编程的主要内容,如果未能解决你的问题,请参考以下文章

Erlang 并发编程基础之一

如何等待用户的输入并继续进行erlang并发编程中的进一步代码?

Erlang / OTP并发编程实战 Erlang程序设计.第2版 PDF分享

回顾Erlang简要

Erlang 摘要

并发-Java并发编程基础