Call-with-Current-Continuation - Zustandssparendes Konzept

Nach dem LesenDer erfahrene Schemer Ich fühlte mich verstandencall/cc richtig. Aber nach ein paar WOW-Tricks mitcall/cc Ich fand, ich habe mich geirrt.

(define cc 0)
(define (f)
  (call/cc (lambda (k)
             (set! cc k)
             3)))

(+ 1 2 4 (f)) ; eval's to 10
(cc 13) ; eval's to 20

Das passt perfekt zu meinem Verständnis. Ich denke, wenn ich a erreichecall/cc aufruf ich speichere gerade den programmstatus. und Aufrufen der Funktion daneben mit einer Funktion. Wenn diese Funktion (k) heißt von irgendwoher, als ich nur das ganze ersetze(call/cc ...) Zeug mit dem Parameter, der ihm gegeben wurde.Das obige Programm scheint auch so zu funktionieren

Aber,

(define (itr lst)
  (define (state k)
    (for-each (lambda (item)
                (call/cc (lambda (h)
                           (set! state h)
                           (k item))))
              lst)
    (k 'done))

  (define (generator)
    (call/cc (lambda (k) (state k))))
  generator)

(define (next)
  (itr (range 2)))

Berufungnext 3 mal ergibt 0, 1 und'done. Das heißt wannstate hat die Funktion benutztk gegeben durchgenerator Der Status des Programms wurde nicht wiederhergestellt.Ich habe dir nur gezeigt, dass ich versucht habe, es zu verstehen.

Also, wie geht das?call/cc eigentlich arbeiten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage