La page "Advanced Scheme: Some Naughty Bits" indique:
Les continuations sont une puissante structure de contrôle-flux à partir de laquelle presque toute autre structure de contrôle-flux [...] peut être dérivée.
Je pensais que Scheme call/cc
, étant lié (*) à l'opérateur J de Peter Landin, pourrait être utilisé pour implémenter n'importe quelle structure de flux de contrôle connue?
Avec "structure de flux de contrôle", je pense spécifiquement à la description de Wikipédia , par exemple les exceptions, les coroutines, les fils verts, etc.
Plus précisément, existe-t-il des exemples de structures de flux de contrôle qui ne peuvent pas être implémentées à l'aide call/cc
?
(*) Je n'ai pas pu déterrer de papier établissant qu'il call/cc
est aussi puissant que l'opérateur J. Un article de Felleisen (que je n'ai pas lu et qui a certes du mal à le comprendre) étudie cela et semble conclure que même s'ils appartiennent à différentes classes de complexité, ils sont formellement équivalents.
(Notez également que j'ai mis à jour la question sur la base des commentaires ci-dessous)
Mise à jour
Sur la base de l'excellente réponse de @Neel ci-dessous, j'ai regardé des sites commentant des suites délimitées et non délimitées , et il semble en effet que call/cc
, étant non délimité, ce n'est pas suffisant. Pendant ce temps, des suites délimitées de première classe (comme shift/reset
) peuvent être utilisées, semble-t-il, pour exprimer toute structure de flux de contrôle.
call/cc
ne peuvent pas exprimer d'exceptions en l'absence d'État . (Comme le souligne Thielecke, des exceptions peuvent être implémentées en passant autour de deux continuations, une pour le programme et l'autre pour le gestionnaire d'exceptions, mais cela nécessite plus que juste call/cc
.)
amb
opérateur-, etc.