Ich habe einen kleinen Scheme-Interpreter in C# geschrieben und festgestellt, dass es auf die Art und Weise, wie ich es implementiert habe, sehr einfach war, Unterstützung für korrekte Fortsetzungen hinzuzufügen.Einfachstes Beispiel für Rückwärtsfortsetzungen in Schema ohne explizite Mutation
Also habe ich sie hinzugefügt ... aber wollen "beweisen", dass sie so, dass ich sie hinzugefügt habe, korrekt ist.
Mein Scheme-Interpreter unterstützt jedoch nicht den "mutierenden" Zustand - alles ist unveränderlich.
So war es ziemlich einfach, einen Unit-Test zu schreiben „nach oben“ Fortsetzungen zu belichten:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Aber ich mag auch einen Komponententest schreiben, dass „entkommt“, dann die noch zeigt, wenn die Fortsetzung auch funktioniert:
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Aber natürlich würde die oben nur testen, dass „ich eine Fortsetzung bekommen“ ... nicht, dass es tatsächlich eine gültige Fortsetzung ist.
Alle Beispiele, die ich finden kann, enden jedoch immer mit "set!" um die entkommene Fortsetzung zu demonstrieren.
Was ist das einfachste Schema-Beispiel, das die richtige Unterstützung für Rückwärts-Fortsetzungen zeigt, ohne sich auf Mutationen zu verlassen?
Sind rückwärts Fortsetzungen jede Verwendung ohne Mutation? Ich fange an zu vermuten, dass sie es nicht sind, weil Sie es nur benutzen könnten, um genau die gleiche Berechnung erneut auszuführen ... was bedeutungslos ist, wenn es keine Nebenwirkungen gibt. Haskell hat deshalb keine Fortsetzungen?
gibt, das ist Hey ordentlich! Ich denke ... Ich muss herausfinden, was um alles in der Welt es jetzt tut !!! ;-) –
OK ich bekomme es jetzt ... Das ist sehr schlau! Und es zeigt eine tatsächliche Verwendung: Schleifen ohne explizite Rekursion. –
Rechts. Natürlich wird jeder, der mit dem Y-Kombinator vertraut ist, Ihnen sagen, dass Sie dafür keine Fortsetzungen brauchen, aber vielleicht kann ich mir etwas vorstellen, das nicht ganz so offensichtlich ist. –