La página "Esquema avanzado: algunos bits traviesos" dice:
Las continuaciones son una construcción poderosa de flujo de control de la cual se puede derivar casi cualquier otra estructura de flujo de control.
¿Pensé que Scheme call/cc
, al estar relacionado (*) con el operador J de Peter Landin, podría usarse para implementar cualquier estructura de flujo de control conocida?
Con la "estructura de flujo de control", estoy pensando específicamente en la descripción que hace Wikipedia de ellos, por ejemplo, excepciones, corutinas, hilos verdes, etc.
Específicamente, ¿hay ejemplos de estructuras de flujo de control que no se puedan implementar usando call/cc
?
(*) No he podido desenterrar ningún documento que establezca que call/cc
sea tan poderoso como el operador J. Un artículo de Felleisen (que no he leído y ciertamente tengo problemas para entenderlo completamente) investiga esto, y parece concluir que a pesar de que están en diferentes clases de complejidad, son formalmente equivalentes.
(También tenga en cuenta que he actualizado la pregunta basada en los comentarios a continuación)
Actualizar
Basado en la excelente respuesta de @Neel a continuación, he mirado sitios que comentan sobre continuaciones delimitadas y no delimitadas , y de hecho parece que call/cc
, si bien no está delimitado, no es suficiente. Mientras tanto, parece que se pueden usar continuaciones delimitadas de primera clase (como shift/reset
) para expresar cualquier estructura de flujo de control.
call/cc
no pueden expresar excepciones en ausencia de estado . (Como Thielecke va a señalar, las excepciones pueden ser implementadas por los que pasa alrededor de dos continuaciones, una para el programa y el otro para el manejador de excepciones, sino que requiere algo más que simplemente call/cc
.)
amb
operador, etc.