在Erlang中实现的进程adder2
具有签名:adder2 (In0, In1, Kill, Out) ->
…
可以发送到此进程的三条消息如中所示图表:{In0, Msg}
、{In1, Msg}
和{Kill}
,其中In0
、In1
和CCD_ 8在函数的自变量中提供,并标识消息
进程本身等待两个输入消息,其中Msg
表示传递的整数值。一旦两个输入都已则它将这些的总和输出到被标识为Out
的进程。
在任何时候在等待输入的同时,可以向其发送Kill
消息应通过正常终止进行响应。
使用上面给出的签名提供此过程的实现。
我理解In0
、In1
和Kill
消息需要有一个接收表达式。然而,我不知道允许以任何顺序接收消息的正确语法,有人能帮我吗?
我也不确定将这两个值加在一起的正确语法。
输出它们需要将它们分配给一个结果值,并发送到Out进程,例如Out ! Result
。
首先,所有变量都以大写字母开头,因此Erlangers将{In0, Msg}
读取为元组,其中两个元素都是可变的。若您指的是第一个元素为固定值的消息,则应该编写{in0, Msg}
或{'In0', Msg}
,其中第一个元素是原子'in0'
或'In0'
。您的adder2
可能有变体,可以配置消息的第一个元素,但它会更复杂。因此,如果我们期望消息{in0, Msg}
、{in1, Msg}
和kill
(它不必是一个单元素元组),那么解决方案可以是:
-module(adder2).
-export([start/1]).
start(Out) ->
spawn(fun() -> adder2(Out) end).
adder2(Out) ->
adder2(undefined, undefined, Out).
adder2(undefined, In1, Out) ->
wait(undefined, In1, Out);
adder2(In0, undefined, Out) ->
wait(In0, undefined, Out);
adder2(In0, In1, Out) ->
Out ! In0 + In1,
adder2(Out).
wait(In0, In1, Out) ->
receive
{in0, Msg} when is_integer(Msg) ->
adder2(Msg, In1, Out);
{in1, Msg} when is_integer(Msg) ->
adder2(In0, Msg, Out);
kill ->
ok; % last in a chain of tail recursive functions so exit normal
Msg ->
io:format("~p: Unknown message: ~p~n", [self(), Msg]),
adder2(In0, In1, Out)
end.
Shell会话示例:
1> c(adder2).
{ok,adder2}
2> P = adder2:start(self()).
<0.43.0>
3> link(P).
true
4> process_flag(trap_exit, true).
false
5> P ! {foo, bar}.
<0.43.0>: Unknown message: {foo,bar}
{foo,bar}
6> P ! {in0, 2.3}.
<0.43.0>: Unknown message: {in0,2.3}
{in0,2.3}
7> P ! {in0, 2}.
{in0,2}
8> P ! {in1, 3}.
{in1,3}
9> flush().
Shell got 5
ok
10> P ! {in1, 2}.
{in0,2}
11> P ! {in1, 3}. % rewrite previous value in wait/3
{in0,3}
12> P ! {in0, 4}.
{in1,4}
13> flush().
Shell got 7
ok
14> P ! {in1, 3}.
{in1,3}
15> P ! kill.
kill
16> flush().
Shell got {'EXIT',<0.43.0>,normal}
ok