2017-11-05 5 views
1

セルを使用してポートを「シミュレート」する方法を理解しようとしていますが、できません。セルを使用したポートとOzのviceversaを実装する

主な考え方は、{Send P X}の動作をシミュレートする{NewPort S P}と他のものをシミュレートする関数またはプロシージャを持つことです。

ここに私が得たもの。

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

あなたの機能SendMessageは、ストリームを後でに構築します。

P := X | @P 

Xが、既存ストリームの先頭に付加されている。だからあなたのテストコードは、ストリーム

a|b|c|_ 

を作成する代わりに、あなたのプログラムは、ストリームの結合していない最後にXを追加する必要があります。つまり、セルP内の変数を、頭部がXであるリストペアにバインドする必要があります。また、テールは新しい変数です。ストリームの新しい未結合端です。したがって、ストリームリーダー(スレッド)はストリームをその先頭から末尾まで読み取ることができます。これはPeter Van RoyとSeif Haridiの著書「5.1.2ポートのセマンティクス」の章でも説明されています。このためのコードは、コードとSendMessageWrong

proc {SendMessageWrong P X} End1 in 
    @P = X | End1 % Line 1 
    P := End1 % Line 2 
end 

もう一つの問題である:セル更新はアトミックではありません。スレッドがSendMessageWrongの最初の行を実行し、別のスレッドがSendMessageWrongの最初の行を実行したときに何が起こるかを想像してください。これをアトミックにする正しい方法は、組み込みのExchangeプロシージャを使用することです。

{Exchange P (X | End1) End1} 
+0

"新しいテール"となる新しいバインドされていない変数。その後、セルに追加する必要がありますか? –

+0

はい。その変数は私のコードでは 'End1'と呼ばれています。 – beroal

関連する問題