Una "continuazione" è l'intero futuro di un calcolo. Ogni punto in un calcolo ha una continuazione che, in termini ingenui, puoi considerare come il contatore di programma corrente e lo stack corrente. La funzione Schema call/cc
acquisisce facilmente la configurazione corrente e la impacchetta in una funzione. Quando invochi quella funzione ritorni a quel punto nel calcolo. Quindi, una continuazione è molto diversa da una funzione (ma la funzione di continuazione è, beh, una funzione).
Ci sono due casi più comuni in cui si vedono tipicamente call/cc
applicate:
uscita non locale. Stabilisci una continuazione, fai qualche calcolo, per terminare bruscamente il calcolo che invochi la continuazione.
riavviare/reinserire un calcolo. In questo caso si salva la continuazione e quindi si chiama di nuovo come ti pare.
Ecco un esempio per il caso # 1:
(begin
;; do stuff
(call/cc (lambda (k)
;; do more
;; oops, must 'abort'
(k 'ignore)))
;; continue on
)
E qui è un esempio per il caso # 2:
> (define C#f)
> (let ((x 10))
(display (list (+ 1 (call/cc (lambda (k) (set! c k) x))) 111))
(display " more"))
(11 111) more
> (c 20)
(21 111) more
> (c 90)
(91 111) more
Per questo caso # 2 Vale la pena notare che la continuazione riporta al ciclo di lettura-eval-print di livello superiore, che ti dà la possibilità di ri-invocare la continuazione in questo esempio!
Non si utilizza 'call/cc' il cui argomento * è * prendendo la continuazione corrente (come funzione). Modifica la tua domanda per usare 'call/cc'! Leggi wikipage su [continuation] (http://en.wikipedia.org/wiki/Continuation) –
Non sto usando call/cc, sto usando una funzione equivalente che rappresenta la continuazione? – ayhid
Continuazione è sintatticamente una funzione ma rappresenta un trasferimento di controllo. Il suo protocollo di chiamata è diverso da quello di una funzione: si suppone che non debba mai tornare. –