2

私は現在、大学で独学コースを取っていますが、噛むことができるよりも少し噛んでいることに気付きました. このコースは Oz プログラミング言語に関するもので、Oz について理解を深めるために電子書籍を読んでおり、理解度をテストするためにいくつかの演習を解こうとしています。私は特定の演習でかなり行き詰まっており、それを解決する方法がよくわかりません. 問題は次のとおりです。

ポートの実装。第 5 章では、単純な通信チャネルであるポートの概念を紹介しました。ポートには、ストリーム S でポート P を返す操作 {NewPort SP} と、ポート P でメッセージ X を送信する {Send PX} があります。これらの操作から、ポートがステートフルなバンドルされていない ADT であることは明らかです。この演習では、セクション 6.4 の手法を使用して、セルに関してポートを実装します。

キーワードは、ステートフル アンバンドルとセルです。次のアプローチで、セルを使用してポートの動作を実装しようとしました。

declare
MyPort
MyStream
proc {NewPortEx ?S ?P}
   P = {NewCell nil}
   S = !!P  %read only view on the cell
end
proc {SendEx P X}
   P:=X|@P  %extend the cell's content, a list, with X
end
in
{NewPortEx MyStream MyPort}
{Browse @MyStream}
{SendEx MyPort c}
{Browse @MyStream}

私の最後のステップは、ラッパー/アンラッパーのペアを追加して ADT を安全にすることですが、最初に機能を適切に動作させたいと考えています。これは正しい動作をしているように見えますが、私が望んでいたものではありません。{Browse MyStream}, なしで, を一度だけ呼び出せるようにしたいと思い@ます。firstSent|secondSent|_<future>ブラウザが期待どおりに表示されるのではなく、の行に沿って何かを表示することを望んでいました。各 の後<Cell>に呼び出す必要があり、出力はリストとして表示されます。BrowseSend[firstSent secondSent]

私が読んだ理論から正しく覚えていれば、これは熱心な評価と怠惰な評価に関係しており、それぞれ(有限)リストと(無限)ストリームになります。

私はそれを正しく行っていないと感じていますが、関数型言語の経験はまったくありません。セルで実装されたポートの例を作成するのを手伝ってくれる人はいますか? (基本的に、既存のNewPortandの独自の実装Send)

前もって感謝します

4

1 に答える 1

1

ストリームは、バインドされていないテールを持つ単なるリストです。たとえば、最初はリストは単なるバインドされていない変数 _ です。要素が送信されるたびに、末尾が新しいペアにバインドされます。たとえば、次のようになります。

(1) Initially:          S = _
(2) Send 1 to the port: S = 1|_
(3) Send 2 to the port: S = 1|2|_
etc.

ポートを閉じない限り、テールは常にバインドされていません。

これで、セルをリストの末尾へのポインタのように使用できます。最初は、セルは S を指しているだけです。その後、SendEx 操作は次の手順で構成されます。

(1) Read the current tail from the cell.
(2) Declare a new unbound variable that will serve as the new tail.
(3) Unify: current tail = X | new tail
(4) Store the new tail in the cell.

お役に立てれば。

于 2012-04-14T22:57:21.647 に答える