J'ai écrit un petit interpréteur Scheme en C#, et j'ai réalisé que de la façon dont je l'avais implémenté, il était très facile d'ajouter un support pour des suites correctes. Donc, je les ai ajoutés ... mais je veux "prouver" que leur façon de les ajouter est correcte.Exemple le plus simple de continuations arrières dans Scheme sans mutation explicite
Mon interpréteur Scheme ne supporte cependant pas l'état de "mutation" - tout est immuable.
Il était assez facile d'écrire un test unitaire pour exposer « vers le haut » continuations:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Cependant, je veux aussi écrire un test unitaire qui démontre que si la poursuite « échappe », alors que toujours fonctionne aussi:
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Mais bien sûr, le serait au-dessus de tout tester: « Je suis une suite » ... pas que c'est en fait une continuation valide. Tous les exemples que je peux trouver, cependant, finissent toujours par utiliser "set!" pour démontrer la continuation échappée.
Quel est l'exemple de schéma le plus simple qui démontre un support approprié pour les continuations vers l'arrière sans dépendre de la mutation?
Les continuations vers l'arrière sont-elles utilisables sans mutation? Je commence à soupçonner qu'ils ne le sont pas, parce que vous ne pouviez l'utiliser que pour refaire exactement le même calcul ... ce qui n'a pas de sens s'il n'y a pas d'effets secondaires. Est-ce la raison pour laquelle Haskell n'a pas de suites?
Hey qui est chouette! Je pense ... j'ai besoin de comprendre ce que ça fait maintenant !!! ;-) –
OK, je l'ai maintenant ... C'est très intelligent! Et il démontre une utilisation réelle: en boucle sans récursion explicite. –
Droite. Bien sûr, toute personne connaissant le combinateur Y vous dira que vous n'avez pas besoin de poursuites pour cela, mais peut-être que je peux trouver quelque chose qui n'est pas aussi évident. –