開いているソケットまたはファイルハンドルが継続とどのように相互作用するかを理解しようとしています。検索の結果、dynamic-wind
はおそらくソリューションの一部であることがわかりましたが、実装よりも方法論に興味があり、さまざまな条件下で実装する方法しか見つかりませんでした。
プログラマーは、dynamic-wind
がソケットを閉じる必要があるような方法で、継続内でソケットを使用することさえありますか?または、継続がソケットが処理される場所を超えて終了する場合、通常は「最終的に」ブロックを実装するための単なる方法ですか?
架空のdynamic-wind
がソケットを閉じた後、継続が再入力された場合はどうなりますか?
プログラムが継続(または継続を使用して実装されることが多い例外)を使用してコンテキストを終了する場合、ファイル、ソケット、およびその他のリソースを自動的に閉じるのが一般的です。多くの場合、これを自動的に行うのに役立つライブラリプロシージャがあります。たとえば、Racketの call-with-input-file * 、 call-with-semaphore などを参照してください。これらはすべて、実装でdynamic-wind
を使用します。
継続がある場合、リソースを正しく使用または管理するコードを作成するのは難しいことがよくあります。たとえば、コントロールがジャンプアウトしたときにファイルが閉じられた場合、コントロールがジャンプインしたときにファイルを再度開く必要がありますか?その場合は、2回目に別のモードで開く必要があるかもしれません。たとえば、切り捨てではなく追加します。しかし、今では、出力が整形式であることを確認するのは難しいかもしれません。継続ジャンプは、パーツが複数回書き込まれたり、順序が狂ったりすることを意味する場合があります。したがって、継続が終了した後、コンテキストにジャンプして戻ることを単に禁止すると便利なことがよくあります。 Racketは、この目的のために call-with-continuation-barrier を提供しますが、dynamic-wind
と可変変数を使用して実行することもできます。
物語は、区切られた継続についてもほぼ同じです。たとえば、shift
は境界を越えてジャンプし、プロシージャを適用すると、キャプチャされたコンテキストの境界を越えてジャンプします。