Continuazione
# Continuazione

In informatica, una continuazione (continuation in inglese) è un modo per rappresentare lo stato di esecuzione di un programma ad un punto dato. Molti linguaggi hanno un costrutto che permette di salvare lo stato corrente di esecuzione per poi riprendere l'esecuzione a partire da questo stato in un momento successivo. Questa tecnica è tipica della programmazione funzionale ma sono molti i linguaggi di programmazione che presentano questa caratteristica con varie denominazioni:

* Scheme: call/cc (abbreviazione di call-with-current-continuation)
* Standard ML of New Jersey: SMLofNJ.CONT.callcc
* C: setcontext et al. (UNIX System V e GNU libc)
* Ruby: callcc
* Python: (vedi oltre) possedeva il modulo continuation ma è stato rimosso.
* Haskell: Monade di continuazione

La continuazione si utilizza per "saltare" da una parte del programma all'altra a seconda delle necessità. Funziona in modo analogo al comando goto presente nel BASIC con la differenza che il comando goto è sconsigliato perché rende la manutenzione del codice difficile mentre la continuazione non rende ardua la modifica del codice quando questo diventa di elevate dimensioni. La continuazione non salta tra linee di codice ma tra stati. Si può vedere il programma come un insieme di stati che evolvono a seconda delle azioni dell'utente e la continuazione consente di saltare tra stati diversi a seconda delle necessità. Utilizza un modello di programmazione simile a quello delle reti di Petri.

Il supporto per la continuazione da parte dei vari linguaggi è molto variabile. Un linguaggio di programmazione supporta la continuazione rientrante o di prima classe se una continuazione può essere richiamata più volte per rientrare nello stesso contesto (l'uso del termine rientrante in questo caso non è da confondere con l'uso fatto trattando il multitasking).

Se le continuazione può essere usata solo per uscire dal contesto corrente, si dice il linguaggio supporta l'escape continuation. Molti linguaggi che non supportanto direttamente la continuazione, hanno il supporto per la gestione delle eccezioni, che è equivalente all'escape continuation e può essere usata per gli stessi scopi. I costrutti C setjmp e longjmp sono di questo tipo: possono essere usati solo per srotolare lo stack e non per ripristinare una precedente continuazione salvata.

Le continuazioni di prima classe possono essere usate per implementare l'ottimizzazione della chiamata di coda. La presenza sia della continuazione di prima classe che dell'ottimizzazione della chiamata di coda garantita, è uno dei punti di distinzione dello Scheme dagli altri linguaggi Lisp.

Molti programmatori che non sono abituati alla continuazione, la trovano un concetto difficile da capire. Il linguaggio di programmazione esoterico Unlambda include questa caratteristica solo per la sua difficoltà di comprensione.

La continuazione è strettamente collegata alla trasformazione della doppia negazione dalla logica classica alla logica intuizionistica attraverso l'isomorfismo di Curry-Howard e alla legge di Peirce.

