1

我试图弄清楚如何使用单元“模拟”一个端口,但我做不到。

主要思想是拥有一个模拟行为的函数或过程,{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|_

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

提前致谢。

4

1 回答 1

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}
于 2017-11-06T15:38:43.333 回答