私は現在、大学で独学コースを取っていますが、噛むことができるよりも少し噛んでいることに気付きました. このコースは 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>
に呼び出す必要があり、出力はリストとして表示されます。Browse
Send
[firstSent secondSent]
私が読んだ理論から正しく覚えていれば、これは熱心な評価と怠惰な評価に関係しており、それぞれ(有限)リストと(無限)ストリームになります。
私はそれを正しく行っていないと感じていますが、関数型言語の経験はまったくありません。セルで実装されたポートの例を作成するのを手伝ってくれる人はいますか? (基本的に、既存のNewPort
andの独自の実装Send
)
前もって感謝します