我正在试图弄清楚如何使用细胞“模拟”一个端口,但我无法做到。
主要思想是拥有一个模拟{NewPort S P}
的函数或过程以及模拟{Send P X}
行为的其他函数或过程。
这就是我得到的。
declare P S
proc {CellPort ?P}
P = {NewCell S}
end
proc {SendMessage P X}
P := X | @P
{Browse @P}
end
in
{CellPort P}
{Browse @P}
{SendMessage P c}
{SendMessage P b}
{SendMessage P a}
港口的工作方式如下:
_
c|_
c|b|_
c|b|a|_
我不知道我做错了什么,我不能像上面那样打印。另外,如何使用端口实现单元?任何指南?
提前致谢。
答案 0 :(得分:1)
您的函数SendMessage
向后构建 。
P := X | @P
X
作为头部附加到现有流。所以你的测试代码会创建一个流
a|b|c|_
相反,您的程序应该将X
添加到流的未绑定端。也就是说,它应该将单元格P
内的变量绑定到头部为X
的列表对,并且哪个尾部是新变量,即流的新未绑定端。因此,流读取器(线程)可以从其头部到尾部读取流。 Peter Van Roy和Seif Haridi在书中的“5.1.2端口语义”中对此进行了描述。这个代码是
proc {SendMessageWrong P X} End1 in
@P = X | End1 % Line 1
P := End1 % Line 2
end
您的代码和SendMessageWrong
的另一个问题:单元格更新不是原子的。想象一下当一个线程执行SendMessageWrong
的第一行时会发生什么,然后另一个线程执行SendMessageWrong
的第一行。使其成为原子的正确方法是使用内置的Exchange
过程。
{Exchange P (X | End1) End1}