使用单元格实现端口,反之亦然

时间:2017-11-05 21:50:43

标签: oz mozart

我正在试图弄清楚如何使用细胞“模拟”一个端口,但我无法做到。

主要思想是拥有一个模拟{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|_

我不知道我做错了什么,我不能像上面那样打印。另外,如何使用端口实现单元?任何指南?

提前致谢。

1 个答案:

答案 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}