A página "Esquema avançado: alguns bits impertinentes" declara:
As continuações são uma poderosa construção de fluxo de controle a partir da qual quase qualquer outra estrutura de fluxo de controle [...] pode ser derivada.
Eu pensei que o esquema call/cc
, estando relacionado (*) ao operador J de Peter Landin, pudesse ser usado para implementar qualquer estrutura de fluxo de controle conhecida?
Com a "estrutura de fluxo de controle", estou pensando especificamente na descrição deles da Wikipedia , por exemplo, exceções, corotinas, linhas verdes e assim por diante.
Especificamente, existem exemplos de estruturas de fluxo de controle que não podem ser implementadas usando call/cc
?
(*) Não consegui desenterrar nenhum papel que call/cc
seja tão poderoso quanto o operador J. Um artigo de Felleisen (que não li e reconhecidamente tenho problemas para entendê-lo completamente) investiga isso e parece concluir que, embora estejam em diferentes classes de complexidade, são formalmente equivalentes.
(Observe também que atualizei a pergunta com base nos comentários abaixo)
Atualizar
Com base na excelente resposta de @Neel abaixo, observei sites comentando continuações delimitadas e não limitadas e , de fato, parece que call/cc
, embora não seja limitado, não é suficiente. Enquanto isso, continuações delimitadas de primeira classe (como shift/reset
) podem ser usadas, ao que parece, para expressar qualquer estrutura de controle-fluxo.
call/cc
não podem expressar exceções na ausência de estado . (Como Thielecke continua a apontar, exceções podem ser implementadas pela passagem de cerca de duas continuações, uma para o programa e outro para o manipulador de exceção, mas que exige mais do que apenas call/cc
.)
amb
operador e assim por diante.