• [^] # Re: Sather

    Posté par (site web personnel) . En réponse à la dépêche Lisaac 0.12 en GPL v3. Évalué à 6.

    • As tu regardé les pages suivantes ?
    • comment définir un iterator http://www.gnu.org/software/sather/docs-1.2/tutorial/iterato(...)
    • quelques exemples avec plusieurs iterator et pas forcément entier http://www.gnu.org/software/sather/docs-1.2/tutorial/iterato(...)
    • J'ai l'impression que ce que tu fait est à des lieux des iterators de Sather et ressemble fortement à ceux de Ruby.
    • Il faut bien comprendre ceci. Un objet dans Sather peut avoir trois types d'objet qui lui sont rattaché : des attributs, des méthodes (jusque là, que du classique) et des iterators. Un itetator N'EST PAS une méthode et ne se comporte pas du tout pareil.
    • Un iterator est une coroutine qui n'est valable que dans un block loop. Il peut y avoir plusieurs iterators dans un même block (ce qui n'est souvent pas le cas dans les autres langages qui n'ont pas d'iterator de bas niveau mais un truc simulé via des méthodes).
    • Un iterator peut avoir des paramêtres de type IN, OUT et INOUT mais avec aussi la notion ONCE ou non. Si un paramêtre à l'adjectif ONCE, il n'est évalué que lors du PREMIER appel alors que sinon, il est évalué à chaque appel.
    • Un iterator n'a pas de valeur de retour comme une fonction mais se suspend via l'instruction yield et renvoi provisoirement une valeur à ce moment là. Lors du prochain appel, c'est l'instruction qui suit yield qui est exécuté.
    • S'il y a une boucle avec plusieurs iterators, c'est le premier iterator qui se termine (plus de yield) qui permet de quitter la boucle, que les autres iterators soit finis ou non. Par contre, le langage à ce moment termine tous les contextes des autres co-routine non finit et purge la mémoire (mais tout cela est complètement transparent).
    • Les iterators de Sather ne sont pas du tout limité aux entiers. C'est juste un cas particulier. Il y a par exemple des ietrator sur les booléens qui permettent de faire les boucles while et until facilement. Il y a plein d'iterator sur les chaînes et aussi sur les réels.
    • Je vais mettre deux exemples que j'aime bien mais la syntaxe de linuxfr est parfois casse-pied. On en trouve d'autres sur le web mieux rédigés.
    • Il faut évidement définir x mais il n'y a pas besoin de l'initialisér, c'est l'iterator sum! qui s'en occupe. Dans cet exemple, trois itérators fonctionnent en parallèle et le code est particulièrement clair et sur (qui n'a pas oublié un jour de faire x:=0 avant la boucle ?).
    • loop
       x := sum!(a.elt! * b.elt!);
      end;
      
    • Un autre qui parle d'affichage qui permet d'imprimer "1,2,3" en mettant une virgule entre les éléments juste ou il faut.
    • a:ARRAY{INT} := |1,2,3|;
      loop
       #OUT + ",".separate!(a.elt!.str);
      end;
      
    • L'iterator separate! est définit comme suit :
    • class STR is
       ...
       separate!(s: STR): STR is
       -- La premiere iteration, on retourne juste la chaine 's'
       -- Sur les suivantes, on retourne Self + 's'
       yield s.str;
       loop
       yield self + s.str;
       end;
       end;
       ...
      end;
      
    • On remarque qu'il y a une boucle infini dans l'itérator separate! Cette boucle ne s'arrête jamais, simplement, lorsque l'iterator separate! n'a plus rien à manger, la boucle au dessus s'arrête d'elle même et toutes les coroutines en cours de tout le contexte sont automatiquement nettoyé.
    • On voit bien sur ces exemples que le block LOOP est particulier et permet de gérer les contextes des iterator. C'est le fait d'avoir ce block spécial qui donne toute la force à ces iterators. Les iterators ne peuvent être employés que dans les block loop avec une petite extension syntaxique avec 'parloop' pour la partie calcul parallèle de Sather
    • http://www.gnu.org/software/sather/docs-1.2/specification/pa(...)
    • Un dernier lien qui donne les spécifications du langage, c'est pas le document le plus pédagogique que j'ai trouvé ;-)
    • http://www.gnu.org/software/sather/docs-1.2/specification/sa(...)