[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