[Marseille-pm] Re: [ppm] YAPC::Europe::2003 (3)
arnaud.assad at free.fr
arnaud.assad at free.fr
Wed Jul 30 02:39:23 CDT 2003
On Wed, Jul 30, 2003 at 02:48:27AM +0200, Sébastien Aperghis-Tramoni wrote:
> À ce propos si toi (ou quelqu'un d'autre) pouvait fournir une
> explication de ce que sont ces fameuses continuations et autres
> coroutines, car pour le moment j'en ai beaucoup entendu parlé, mais je
> n'ai aucune idée de ce que c'est.
>
Comme moi aussi, ca commencait à me tarabuster je me suis renseigné en
rentrant.
Voici donc l'avis d'un NEWBIE en ce domaine pour d'autres newbies :
I) Continuation
1.1) Définition courte (et naive)
Une continuation est une espèce de closure (fonction qui "capture" son
environement lexical) qui contient AUSSI sa chaine de controle (la chaine
de controle représente la pile d'appel, souvent représentée par ue liste
chainée)
1.2) Déveleppement
D'abord sur le pourquoi de la chose : Cela permet de faire des optimisation
sympa (tail calls/tail recursion) simplement et rapidement, parce que cela peut
etre la base d'un systeme d'exception.
De part la définition donnée plus haut, on comprend aisément que les
continuations sont un surensemble des closures.
Mais je crois que que Dan a envie de faire d'autres trucs vraiment plus
"tordues" avec (dans son talk il parlait par exemple de reprendre
l'exécution de la continuation a un autre endroit que celui sauvegardé
lors de la capture de l'environnement ! Et la beaucoup de gens ont trouvé
ça "evil" ;-)
Bon pour faire ca il s'appuie sur une nouvelle facon d'appeller les
fonctions : CPS (Continuaton Passing Style)
1.3) Pointeurs
Le site de Dan (tant qu'a faire) : http://www.sidhe.org/~dan/blog/
II) Co-routines
2.1) Définition courte (et naive)
Une coroutine est une fonction qui peut retourner a nimporte quel moment,
et lors de son invocation suivante reprendre son exécution A PARTIR de cet
endroit.
2.2) Développement
Un exemple simple
sub lacoroutine {
# code A
yeld 1; # retourne 1;
# code B
yeld 2; # retourne 2;
# code C
yeld 3; # retourne 3;
}
lacoroutine();
lacoroutine();
lacoroutine();
lacoroutine();
retournera 1, puis 2, puis 3, puis 1.
Lors du premier appel le code A sera exécuté ainsi que le yeld 1
Lors du second appel le code B sera exécuté ainsi que le yeld 2
Lors du troisieme appel le code C sera exécuté ainsi que le yeld 3
Lors du quatrieme appel le code A sera exécuté ainsi que le yeld 1
...
A noter plusieurs comportement sont possibles quand on passe des paramètres
(prendre les paramètres de l'appel, précédent, continuer l'exécution avec
les nouveaux parametres...
2.3) Pointeurs
Le site de Dan : http://www.sidhe.org/~dan/blog/
Tout ce qui dit Damian sur le sujet en particulier :
http://archive.develooper.com/perl6-language@perl.org/msg15348.html
N'hésitez pas à corriger, annoter, commenter.
Arnaud.
More information about the Marseille-pm
mailing list