p(M, C, B, I) when B =:= 32#3J ->
receive {_} -> a
after 27#5C ->
C ! { self(), { M, (B * 13#37) rem 35#7B, I }} end;
这是一段需要输入的代码,我知道它需要看起来像(num,num,115,num)
才能传递第一部分,但是我不明白在receive
和after
之后会发生什么,有人能解释一下吗?
我试着阅读erlang的文档,但就是看不懂那部分代码。
1条答案
按热度按时间flvtvl501#
下面是一个receive表达式:
在erlang中,
receive
等待消息发送到执行receive的进程。消息必须匹配Pattern(在本例中为{_}
),才能执行匹配子句的Body(否则接收方无限期地等待匹配消息)项{_}
匹配由元组{}
组成的任何消息,其中元组内具有单个项,_
。符号_
匹配任何内容,因此元组可以包含嵌套元组、列表、字符串、数字...任何内容。因此,元组{[1,a,"hello"]}
将匹配,但元组{a, 2}
不匹配。receive..after
的工作方式与receive完全相同,只是如果在ExprT毫秒内没有匹配的消息到达,则改为计算BodyT。下面是您的代码:
整数可以用以下格式表示:base #值,并且
27#5C
与十进制数147相同。在此行中:
变量
C
将包含一个进程标识符,在Erlang中称为"pid",运算符!
向左侧指定的进程发送一条消息。右侧是发送给进程C
的消息,在本例中,该消息是一个元组,包含当前进程标识符self()
作为第一项,另一元组作为第二项。您的代码由一个包含receive语句的函数组成,其中receive有一个147毫秒的超时,在
receive
行执行之后,如果当前进程邮箱中有一条消息与{_}
匹配,或者如果进程在接下来的147毫秒内收到一条与{_}
匹配的消息,则该函数返回原子a
。否则,函数将向另一个进程发送消息并返回相同的消息--因为!
返回的是右边的值。在erlang中,您可以在一台基本的笔记本电脑上轻松地启动一百万个进程,这些进程可以相互发送消息,也可以接收特定的消息并执行代码来响应这些消息。