Ich habe einen kleinen Scheme-Interpreter in C# geschrieben und festgestellt, dass die Art und Weise, wie ich ihn implementiert hatte, es sehr einfach war, Unterstützung für richtige Fortsetzungen hinzuzufügen.
Ich habe sie also hinzugefügt... möchte aber "beweisen", dass die Art und Weise, wie ich sie hinzugefügt habe, korrekt ist.
Mein Scheme-Interpreter hat jedoch keine Unterstützung für "mutating" Zustand - alles ist unveränderlich.
Es war also ziemlich einfach, einen Unit-Test zu schreiben, um Fortsetzungen "nach oben" aufzudecken:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Ich möchte jedoch auch einen Einheitstest schreiben, der zeigt, dass die Fortsetzung auch dann noch funktioniert, wenn sie "ausbricht":
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Aber natürlich würde die oben genannten nur testen, dass "Ich habe eine Fortsetzung" ... nicht, dass es tatsächlich eine gültige Fortsetzung ist.
Alle Beispiele, die ich finden kann, enden jedoch immer mit "set!", um die escaped continuation zu demonstrieren.
Was ist das einfachste Scheme-Beispiel, das die richtige Unterstützung für rückwärts gerichtete Fortsetzungen demonstriert, ohne sich auf Mutation zu verlassen?
Sind rückwärts gerichtete Fortsetzungen ohne Mutation überhaupt sinnvoll? Ich fange an zu vermuten, dass sie es nicht sind, weil man sie nur benutzen könnte, um genau dieselbe Berechnung noch einmal auszuführen... was sinnlos ist, wenn es keine Nebeneffekte gibt. Ist das der Grund, warum es in Haskell keine Fortsetzungen gibt?