La pagina "Advanced Scheme: Some Naughty Bits" indica:
Le continuazioni sono un potente costrutto del flusso di controllo dal quale è possibile derivare quasi ogni altra struttura [...] del flusso di controllo.
Ho pensato che Scheme call/cc
, essendo correlato (*) all'operatore J di Peter Landin, potesse essere usato per implementare qualsiasi struttura di flusso di controllo conosciuta?
Con la "struttura del flusso di controllo" sto pensando in particolare alla loro descrizione di Wikipedia , ad esempio eccezioni, coroutine, fili verdi e così via.
In particolare, ci sono esempi di strutture di flusso di controllo che non possono essere implementate usando call/cc
?
(*) Non sono stato in grado di scavare alcun documento che dimostri che call/cc
è potente come l'operatore J. Un articolo di Felleisen (che non ho letto e che certamente ho problemi a comprenderlo appieno) lo analizza e sembra concludere che, sebbene si trovino in classi di complessità diverse, sono formalmente equivalenti.
(Nota anche che ho aggiornato la domanda in base ai commenti qui sotto)
Aggiornare
Sulla base dell'eccellente risposta di @Neel di seguito, ho esaminato i siti che commentano continuazioni delimitate e non delimitate , e in effetti sembra che call/cc
, pur non essendo delimitate, non sia sufficiente. Nel frattempo, sembra che si possano usare continuazioni delimitate di prima classe (come shift/reset
) per esprimere qualsiasi struttura del flusso di controllo.
call/cc
non possono esprimere eccezioni in assenza di stato . (Come sottolinea Thielecke, le eccezioni possono essere implementate passando due continuazioni, una per il programma e l'altra per il gestore delle eccezioni, ma ciò richiede più di un semplice call/cc
.)
amb
escape, operatore e così via.