私は C# で小さな Scheme インタープリターを書きましたが、それを実装した方法では、適切な継続のサポートを追加するのが非常に簡単であることに気付きました。
だから私はそれらを追加しました...しかし、私がそれらを追加した方法が正しいことを「証明」したいのです。
ただし、Scheme インタープリターは「変更」状態をサポートしていません。すべてが不変です。
したがって、「上向き」の継続を公開する単体テストを作成するのは非常に簡単でした。
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
ただし、継続が「エスケープ」した場合でも機能することを示す単体テストも作成したいと思います。
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
しかしもちろん、上記は「継続を取得した」ことをテストするだけであり、実際に有効な継続であるとは限りません。
ただし、私が見つけることができるすべての例は、常に「set!」を使用して終了します。エスケープされた継続を示すために。
ミューテーションに依存せずに後方継続を適切にサポートしていることを示す最も単純なSchemeの例は?
後方継続は突然変異なしで役に立ちますか? まったく同じ計算を再度実行するためにしか使用できないため、そうではないのではないかと疑い始めています...副作用がなければ意味がありません。これが Haskell に継続がない理由ですか?