Was sind continuations?
-
Zitat von http://de.wikipedia.org/wiki/Scheme:
Drei wesentliche Merkmale unterscheiden Scheme von LISP. Zum einen gibt es in Scheme die Funktion call-with-current-continuation, die es erlaubt, die gegenwärtige Continuation des Programms anzusprechen oder an eine Variable zu binden. Damit ist es möglich, durch Aufrufen der in jener Variablen gespeicherten Continuation später im Programm an die Stelle dieser Continuation zurück zu springen.
Was sind Continuations?
-
-
Eine Continuation ist der "Rest des Programms". Es ist schwierig, Continuations in eine Art Definition zu erklaeren. Deswegen naehert man sich mit Beispielen dem Verstaendnis. Hier zwei Links:
http://www.scheme.com/tspl3/control.html#./control:h5
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-15.html#node_chap_13Und noch ein Video: http://www.uni-koblenz.de/~laemmel/paradigms0910/resources/denotational2.html
-
Einer noch:
http://www.madore.org/~david/computers/callcc.htmlContinuations sind nicht-lexikalisch bestimmte Exceptions, die (im Normalfall beliebig oft) überall hin springen können und dabei den gesamten Kontext erhalten. Diese Dinger bekommen einfach first-class-Bürgerschaft oder werden als Funktion getarnt, dann funktionieren sie wie Wurmlöcher, die in der Zeit zurückführen. Wenn du Stack-basiert denkst, kannst du dir vorstellen, dass eine Continuation eine vollständige Kopie des Stacks ist.
-
Es ist schlecht, Continuations mit Exceptions zu erklaeren, da Exceptions eine Spezialform von Continuations sind. Und Continuations koennen selbst nirgends zurueckspringen, sondern man kann ueber eine gespeicherte Continuations an den entsprechenden Punkt im Kontrollfluss springen. Mittels
call/cc
in Scheme bindet man die aktuelle Continuation an eine Variable, um sie vielleicht spaeter zu benutzen.kannst du dir vorstellen, dass eine Continuation eine vollständige Kopie des Stacks ist.
Auch das ist nicht ganz richtig im Sinne von Stack in Programmiersprachen wie C oder C++. Wenn man naemlich an einen Punkt zurueckspringt und der Stack eine echte Kopie gewesen ist, dann hat sich nichts im Vergleich zum frueheren Aufruf geaendert und die Berechnung laeuft auf glieche Weise von vorn ab.