août
2010
Pour l’usage que j’envisageais (l’implémentation des continuations), un pointeur de fonction seul n’est pas de grand secours. Mais si l’on y joint un contexte, c’est-à-dire des variables initialisées à l’avance, il devient possible de simuler les continuations. On peut appeler la fonction accompagnée d’un contexte une closure. Simplement le programme principal doit exécuter une boucle de continuations: partir d’une closure, l’invoquer pour récupérer une nouvelle closure, et recommencer en boucle. Le programme termine quand la dernière closure invoque EXIT.
Pour vérifier que cette idée marche je l’ai appliquée à la traduction du programme « HelloWorld » en Java. Java utilise les classes anonymes comme closures, si bien que j’ai adopté la classe comme remplacement pour les continuations.
Pour donner une idée, voici un extrait du programme:
if (n < 7)
{
return new _F_println(out, "Hello World!", new Fun()
{
public Fun call()
{
return new _F_loop(n+1, out, _c_return);
}
});
}
else
{
return _c_return;
}
Ici on voit que chaque branche du if se contente d’un return; si la valeur de n atteint 7, la prochaine closure est celle qui a été fournie comme continuation de retour à la fonction; autrement on construit une nouvelle closure qui commence par la fonction « println » puis continue avec la fonction « loop » de façon récursive, en augmentant n de un.
Dans ce cas la closure de retour de « println » ne fait que retourner une nouvelle closure, elle est superflue. On pourrait simplifier:
return new _F_println(out, "Hello World!",
new _F_loop(n+1, out, _c_return));
Un compilateur suffisamment perfectionné favorisera cette version.
Pour conclure voici la boucle de continuations en Java:
while (true)
{
next = next.call();
}
Je compte bien travailler sur l’implémentation de dodo maintenant que j’en suis là, alors ne manquez pas la suite!

Un article de bredelet
Le site du projet dodo:
http://dodo.sourceforge.net