Wahr. Alle Programme haben Fortsetzungen bis zum Stillstand. Eine Fortsetzung ist normalerweise ein Schritt in der Berechnung, die von der zugrunde liegenden Implementierung durchgeführt wird.
Ihr Beispiel:
(+ (* 2 3) 5)
Die Kombination + ist auf der Kombination abhängig * zuerst zu beenden. Somit ist (+ result 5)
in der Tat die Fortsetzung von (* 2 3)
. Es ist jedoch keine Prozedur in diesem Zusammenhang. Die Nützlichkeit von call/cc
ist, wenn Sie eine Fortsetzung haben, die Sie bedauern, und möchten stattdessen etwas anderes tun, oder Sie möchten zu einem späteren Zeitpunkt darauf zurückkommen. Lets tun, um die erste:
(define g 0)
(call/cc
(lambda (exit)
(/ 10 (if (= g 0) (exit +Inf.0) g))))
Offensichtlich gibt eine Abteilung, die die Fortsetzung ist, wenn das Ergebnis der, wenn gemacht wird, aber da exit
wird das Ganze ausgefuehrt wird kurzgeschlossen + Inf.0 zurückzukehren.
Wie würden Sie das mit einer Prozedur machen, ohne dass Sie danach die Division machen? In diesem Stil können Sie nicht.
Es ist nicht wirklich Magie, da Schema Ihren Code in Continuation Passing Style(=CPS) konvertiert und in CPS Call/CC ist keine spezielle. Es ist kein trivialer Code in CPS.
Hier ist die CPS Definition von call/cc
(define (kcall/cc k consumer)
(consumer k (lambda (ignore v) (k v))))
Sie verwenden 'call/cc' nicht, dessen Argument * die aktuelle Fortsetzung (als Funktion) ist. Bearbeiten Sie Ihre Frage, um 'call/cc' zu verwenden! Wikipage lesen auf [Fortsetzung] (http://en.wikipedia.org/wiki/Continuation) –
Ich benutze nicht Call/cc, verwende ich eine äquivalente Funktion repräsentiert die Fortsetzung? – ayhid
Die Fortsetzung ist syntaktisch eine Funktion, aber sie stellt eine Steuerungsübertragung dar. Sein Anrufprotokoll ist anders als das einer Funktion - es soll nie zurückkehren. –