Created
June 25, 2016 10:23
-
-
Save cognominal/4edd4ac61d39016291bc7aeffa59ab5c to your computer and use it in GitHub Desktop.
prez.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!doctype html> | |
| <html> | |
| <head> | |
| <title></title> | |
| <meta charset="UTF-8" /> | |
| <style> | |
| /* code gets the browser-default font | |
| * kbd gets a slightly less common monospace font | |
| * samp gets the hard pixelly fonts | |
| */ | |
| kbd { font-family: "Droid Sans Mono", "Luxi Mono", "Inconsolata", monospace } | |
| samp { font-family: "Terminus", "Courier", "Lucida Console", monospace } | |
| /* WHATWG HTML frowns on the use of <u> because it looks like a link, | |
| * so we make it not look like one. | |
| */ | |
| u { text-decoration: none } | |
| .nested { | |
| margin-left: 3em; | |
| } | |
| // footnote things: | |
| aside, u { opacity: 0.7 } | |
| a[id^="fn-"]:target { background: #ff0 } | |
| </style> | |
| <link rel="stylesheet" href="//design.perl6.org/perl.css"> | |
| </head> | |
| <body class="pod" id="___top"> | |
| <nav class="indexgroup"> | |
| <ol class="indexList indexList1"> | |
| <li class="indexItem indexItem1"><a href="#Cette_pr%C3%A9sentation_">Cette présentation </a></li> | |
| <li class="indexItem indexItem1"><a href="#Si_Perl_6_install%C3%A9%2C_utiliser_le_REPL">Si Perl 6 installé, utiliser le REPL</a></li> | |
| <li class="indexItem indexItem1"><a href="#Exp%C3%A9rimenter_avec_Perl_6_sans_l%27installer">Expérimenter avec Perl 6 sans l'installer</a></li> | |
| <li class="indexItem indexItem1"><a href="#Pr%C3%A9sentation_suivante_%3A_les_roles">Présentation suivante : les roles</a></li> | |
| <li class="indexItem indexItem1"><a href="#Distinction_entre_r%C3%B4le_et_classe">Distinction entre rôle et classe</a></li> | |
| <li class="indexItem indexItem1"><a href="#Programmation_Orient%C3%A9e_Objet_en_Perl6">Programmation Orientée Objet en Perl6</a></li> | |
| <li class="indexItem indexItem1"><a href="#Attributs_d%C2%B4objet_et_accesseur_class_A_%7B_has_int_%24%21val_%3D_42%3B_has_.%24b_is_rw%3B_%7D_">Attributs d´objet et accesseur class A { has int $!val = 42; has .$b is rw; } </a></li> | |
| <li class="indexItem indexItem1"><a href="#m%C3%A9thodes">méthodes</a></li> | |
| <li class="indexItem indexItem1"><a href="#Syntaxe_pour_une_classe_par_fichier">Syntaxe pour une classe par fichier</a></li> | |
| <li class="indexItem indexItem1"><a href="#invocant_et_pseudo-classe">invocant et pseudo-classe</a></li> | |
| <li class="indexItem indexItem1"><a href="#instanciation_de_classes">instanciation de classes</a></li> | |
| <li class="indexItem indexItem1"><a href="#Attributs_et_m%C3%A9thodes_de_classe">Attributs et méthodes de classe</a></li> | |
| <li class="indexItem indexItem1"><a href="#Types_et_valeurs_de_d%C3%A9faut_des_attributs">Types et valeurs de défaut des attributs</a></li> | |
| <li class="indexItem indexItem1"><a href="#Accesseur_d%27attribut_rw_ou_m%C3%A9thode_lvalue_%3F">Accesseur d'attribut rw ou méthode lvalue ?</a></li> | |
| <li class="indexItem indexItem1"><a href="#Containers_">Containers </a></li> | |
| <li class="indexItem indexItem1"><a href="#Retour_sur_le_container_Proxy">Retour sur le container Proxy</a></li> | |
| <li class="indexItem indexItem1"><a href="#types">types</a></li> | |
| <li class="indexItem indexItem1"><a href="#Boxing">Boxing</a></li> | |
| <li class="indexItem indexItem1"><a href="#exemple_de_boxing_">exemple de boxing </a></li> | |
| <li class="indexItem indexItem1"><a href="#type_valeur_et_type_r%C3%A9f%C3%A9rence_%281%29">type valeur et type référence (1)</a></li> | |
| <li class="indexItem indexItem1"><a href="#type_valeur_et_type_r%C3%A9f%C3%A9rence_%282%29">type valeur et type référence (2)</a></li> | |
| <li class="indexItem indexItem1"><a href="#passer_par_r%C3%A9ference">passer par réference</a></li> | |
| <li class="indexItem indexItem1"><a href="#%C3%A9galit%C3%A9_et_identit%C3%A9">égalité et identité</a></li> | |
| <li class="indexItem indexItem1"><a href="#op%C3%A9rateurs_sont_des_exemples_de_multi_subs">opérateurs sont des exemples de multi subs</a></li> | |
| <li class="indexItem indexItem1"><a href="#pseudo_sigil_backslash">pseudo sigil backslash</a></li> | |
| <li class="indexItem indexItem1"><a href="#Un_exemple_de_multisub">Un exemple de multisub</a></li> | |
| <li class="indexItem indexItem1"><a href="#Quelques_exemples">Quelques exemples</a></li> | |
| <li class="indexItem indexItem1"><a href="#liage_dynamique_%28binding%29_et_affectation">liage dynamique (binding) et affectation</a></li> | |
| <li class="indexItem indexItem1"><a href="#Immutabilit%C3%A9_et_conteneur">Immutabilité et conteneur</a></li> | |
| <li class="indexItem indexItem1"><a href="#Immutabilit%C3%A9_%3A_listes%2C_tableaux_%281%29">Immutabilité : listes, tableaux (1)</a></li> | |
| <li class="indexItem indexItem1"><a href="#Immutabilit%C3%A9_%3A_listes%2C_tableaux_%282%29">Immutabilité : listes, tableaux (2)</a></li> | |
| <li class="indexItem indexItem1"><a href="#Identit%C3%A9_de_conteneur">Identité de conteneur</a></li> | |
| <li class="indexItem indexItem1"><a href="#d%C3%A9claration_de_type">déclaration de type</a></li> | |
| <li class="indexItem indexItem1"><a href="#Mu%2C_Any%2C_Junction%2C_Cool%2C_Failure%2C">Mu, Any, Junction, Cool, Failure,</a></li> | |
| <li class="indexItem indexItem1"><a href="#Junction">Junction</a></li> | |
| <li class="indexItem indexItem1"><a href="#.perl%2C_.gist%2C_.Str">.perl, .gist, .Str</a></li> | |
| <li class="indexItem indexItem1"><a href="#.perl%2C_.gist%2C_.Str_sur_classes_et_instances">.perl, .gist, .Str sur classes et instances</a></li> | |
| <li class="indexItem indexItem1"><a href="#.perl%2C_.gist%2C_.Str_sur_un_match">.perl, .gist, .Str sur un match</a></li> | |
| <li class="indexItem indexItem1"><a href="#M%C3%A9tamod%C3%A8le">Métamodèle</a></li> | |
| <li class="indexItem indexItem1"><a href="#M%C3%A9tamod%C3%A8le">Métamodèle</a></li> | |
| <li class="indexItem indexItem1"><a href="#Quelques_concepts_cl%C3%A9">Quelques concepts clé</a></li> | |
| </ol> | |
| </nav> | |
| <h1 id="Cette_présentation_"><a class="u" href="#___top" title="go to top of document">Cette présentation </a></h1> | |
| <p>Stéphane cognominal Payrard -- Journées Perl 2016 -- Samedi 25 Juin 2016</p> | |
| <p>Ce talk</p> | |
| <ul><li><p>Objet et sa place dans les types Perl</p> | |
| </li> | |
| <li><p>Multiméthodes</p> | |
| </li> | |
| <li><p>Métamodèle OO</p> | |
| </li> | |
| </ul> | |
| <h1 id="Si_Perl_6_installé,_utiliser_le_REPL"><a class="u" href="#___top" title="go to top of document">Si Perl 6 installé, utiliser le REPL</a></h1> | |
| <ul><li><p>Pas de perte de la portée lexicale</p> | |
| </li> | |
| <li><p>Chaque ligne fait un EVAL</p> | |
| </li> | |
| <li><p>... dans une portee emboitée</p> | |
| </li> | |
| </ul> | |
| <pre>$ perl6-m # avec le backend MoarVM | |
| To exit type ' exit' or '^D' | |
| > say 'Salut les mongueurs' | |
| Salut les mongueurs | |
| > 'Salut les mongueurs' | |
| Salut les mongueurs | |
| > my $a = 'salut' | |
| salut | |
| > $a | |
| salut | |
| > class A {} | |
| (A) | |
| > class A {} | |
| Redeclaration of symbol A | |
| > $a | |
| > $a | |
| Variable '$a' is not declared</pre> | |
| <h1 id="Expérimenter_avec_Perl_6_sans_l'installer"><a class="u" href="#___top" title="go to top of document">Expérimenter avec Perl 6 sans l'installer</a></h1> | |
| <p>Utiliser le bot p6eval </p> | |
| <ul><li><p>grâce à IRC</p> | |
| </li> | |
| <li><p>aller sur irc.freenode.net</p> | |
| </li> | |
| <li><p>/join #perl6</p> | |
| </li> | |
| <li><p>m: say "hello world" # en public</p> | |
| </li> | |
| <li><p>/msg camelia m: say "hello world" # en privé</p> | |
| </li> | |
| <li><p>sur irc.perl.org #perlfr le bot s'appelle p6eval</p> | |
| </li> | |
| <li><p>affichage explicite contrairement au REPL</p> | |
| </li> | |
| </ul> | |
| <pre>si pas d'IRC, hotspot "iPhone de stephane" "larrywall"</pre> | |
| <h1 id="Présentation_suivante_:_les_roles"><a class="u" href="#___top" title="go to top of document">Présentation suivante : les roles</a></h1> | |
| <ul><li><p>roles comme interface matérialisé par les sigils</p> | |
| </li> | |
| <li><p>roles paramétriques, un peu comme generics de Java</p> | |
| </li> | |
| </ul> | |
| <h1 id="Distinction_entre_rôle_et_classe"><a class="u" href="#___top" title="go to top of document">Distinction entre rôle et classe</a></h1> | |
| <ul><li><p>Une classe permet d'instancier des objets</p> | |
| </li> | |
| <li><p>On peut composer des classes à partir de roles</p> | |
| </li> | |
| <li><p>Classes mutables, roles, pas</p> | |
| </li> | |
| <li><p>Mais on peut mixer des roles dans un classe/objet</p> | |
| </li> | |
| <li><p>statiquement : trait dynamiquement : mixin </p> | |
| </li> | |
| </ul> | |
| <pre>class A {}; class A is B {}</pre> | |
| <p>implémenté en terme de :</p> | |
| <pre>multi sub trait_mod:<is>(Mu:U $child, Mu:U $parent) { ... }</pre> | |
| <h1 id="Programmation_Orientée_Objet_en_Perl6"><a class="u" href="#___top" title="go to top of document">Programmation Orientée Objet en Perl6</a></h1> | |
| <ul><li><p>OO à base de classes versus prototpypes</p> | |
| </li> | |
| <li><p>Perl 6 à base de classes</p> | |
| </li> | |
| <li><p>Mais métamodèle permet d'implémenter OO à base de prototypes</p> | |
| </li> | |
| <li><p>Multiméthodes</p> | |
| </li> | |
| <li><p>Rôles (prochaine présentation)</p> | |
| </li> | |
| <li><p>Tous les types de Perl 6 ne sont pas objets</p> | |
| </li> | |
| <li><p>process multifils et intérêt de l'immutabilité</p> | |
| </li> | |
| </ul> | |
| <h1 id="Attributs_d´objet_et_accesseur_class_A_{_has_int_$!val_=_42;_has_.$b_is_rw;_}_"><a class="u" href="#___top" title="go to top of document">Attributs d´objet et accesseur class A { has int $!val = 42; has .$b is rw; } </a></h1> | |
| <pre>twigil ! pour attribut privé non accessible classes dérivées | |
| twigil . pour attribut public | |
| is rw pour attribut en lecture écriture | |
| my A $a = ... | |
| say $a.b # accesseur en lecture <=> appel de méthode | |
| $a.b = 666 # acesseur en écriture</pre> | |
| <h1 id="méthodes"><a class="u" href="#___top" title="go to top of document">méthodes</a></h1> | |
| <pre>class Salut { | |
| has $.qui is required; | |
| method salut { say "salut $!qui" } | |
| } | |
| $_ = Salut.new(:qui<dude>); # .new utilise argument nommés | |
| $_.salut; | |
| .salut; # invocant implicite</pre> | |
| <h1 id="Syntaxe_pour_une_classe_par_fichier"><a class="u" href="#___top" title="go to top of document">Syntaxe pour une classe par fichier</a></h1> | |
| <pre>unit class Salut; | |
| has $.qui | |
| method salut() { say "salut $!qui" }my</pre> | |
| <h1 id="invocant_et_pseudo-classe"><a class="u" href="#___top" title="go to top of document">invocant et pseudo-classe</a></h1> | |
| <ul><li><p>invocant par défaut est self</p> | |
| </li> | |
| <li><p>pamètre invocant généralement omis de la sigature</p> | |
| </li> | |
| <li><p>si explictite, le : separe l'invocant des autres parametres</p> | |
| </li> | |
| <li><p>::?CLASS permet de capturer la classe</p> | |
| </li> | |
| <li><p>utile pour classe anonyme</p> | |
| </li> | |
| <li><p>ou pour éviter d'utiliser le nom</p> | |
| </li> | |
| </ul> | |
| <pre>class A { | |
| method bar { self.doit } | |
| method doit($self:) { ... } | |
| method foo(::?CLASS $self) { | |
| my ::?CLASS $a | |
| } | |
| }</pre> | |
| <h1 id="instanciation_de_classes"><a class="u" href="#___top" title="go to top of document">instanciation de classes</a></h1> | |
| <pre>class Salut { | |
| has $.qui | |
| method salut($quoi) { say "$quoi $!qui" } | |
| } | |
| $_ = Salut.new(:qui<dude>); | |
| .salut: bonjour; | |
| .salut(´bonjour´) | |
| salut $_: </pre> | |
| <h1 id="Attributs_et_méthodes_de_classe"><a class="u" href="#___top" title="go to top of document">Attributs et méthodes de classe</a></h1> | |
| <p>Une classe est un module donc déclarateur de scope classique.</p> | |
| <ul><li><p>my : privé</p> | |
| </li> | |
| <li><p>our : public</p> | |
| </li> | |
| </ul> | |
| <pre>method oh_so_static(::?CLASS:U:) { } | |
| method oh_so_static(A:U:) { }</pre> | |
| <p>Explication de signature</p> | |
| <ul><li><p>A nom de classe</p> | |
| </li> | |
| <li><p>A:U valeur indéfinie seulement, donc classe pas instance</p> | |
| </li> | |
| <li><p>A:U: le paramètre est invocant</p> | |
| </li> | |
| </ul> | |
| <h1 id="Types_et_valeurs_de_défaut_des_attributs"><a class="u" href="#___top" title="go to top of document">Types et valeurs de défaut des attributs</a></h1> | |
| <ul><li><p>les attributs ont un sigil ! même si déclaré avec .</p> | |
| </li> | |
| <li><p>le type implicite d'un attribut est Mu </p> | |
| </li> | |
| <li><p>pour accepter les Junctions, dérivé de Mu</p> | |
| </li> | |
| <li><p>mais initialisé par défaut à Any</p> | |
| </li> | |
| </ul> | |
| <pre>> class A { has $.a; has $!b }; A.^attributes | |
| (Mu $!a Mu $!b) | |
| > say A.new( :a(1|2)).a.WHAT | |
| (Junction) | |
| > A.new.a.WHAT</pre> | |
| <pre>(Any)</pre> | |
| <h1 id="Accesseur_d'attribut_rw_ou_méthode_lvalue_?"><a class="u" href="#___top" title="go to top of document">Accesseur d'attribut rw ou méthode lvalue ?</a></h1> | |
| <p>Même interface pour l'utilisateur</p> | |
| <ul><li><p>l'utilisateur d'une classe n'a pas à connaître ses attributs</p> | |
| </li> | |
| <li><p>détail d'implémentation qui peut changer</p> | |
| </li> | |
| <li><p>même si attribut publique</p> | |
| </li> | |
| <li><p>la méthode .b remplace l'accesseur autogénéré</p> | |
| </li> | |
| <li><p>.quelquechose : point comme pseudosigil pour désigner une méthode</p> | |
| </li> | |
| </ul> | |
| <pre>method b is rw { | |
| return Proxy.new( | |
| FETCH => method () { say 'fetch'; $!b }, | |
| STORE => method ($new) { say 'store' $!b }, | |
| ); | |
| }</pre> | |
| <h1 id="Containers_"><a class="u" href="#___top" title="go to top of document">Containers </a></h1> | |
| <ul><li><p>un Proxy est une forme de container</p> | |
| </li> | |
| <li><p>Scalar est le container par défaut</p> | |
| </li> | |
| <li><p>.VAR donne le container d'une valeur</p> | |
| </li> | |
| <li><p>.WHAT donne le type d'une valeur</p> | |
| </li> | |
| <li><p>.VAR et .WHAT sont des macros</p> | |
| </li> | |
| </ul> | |
| <pre>> my $a; say $a.VAR.WHAT | |
| (Scalar) | |
| my $a; say $a.VAR # bogue. Décontenairisation parasite | |
| Any</pre> | |
| <h1 id="Retour_sur_le_container_Proxy"><a class="u" href="#___top" title="go to top of document">Retour sur le container Proxy</a></h1> | |
| <p>#perl6++ timotimo++ pour l'exemple</p> | |
| <pre>my $foo := Proxy.new( | |
| FETCH => -> | { "yo" }, | |
| STORE => -> | { }); | |
| say $foo.VAR.WHAT; | |
| say $foo | |
| (Proxy) | |
| yo</pre> | |
| <h1 id="types"><a class="u" href="#___top" title="go to top of document">types</a></h1> | |
| <pre>int, num, int8... types natifs dont la valeur tient dans un registre | |
| types natifs | |
| objets</pre> | |
| <ul><li><p>les types natifs n'ont pas d'annotation de type,</p> | |
| </li> | |
| <li><p>les objets, si</p> | |
| </li> | |
| <li><p>mais autoboxing: 1.WHAT</p> | |
| </li> | |
| </ul> | |
| <h1 id="Boxing"><a class="u" href="#___top" title="go to top of document">Boxing</a></h1> | |
| <ul><li><p>On peut traiter les types natifs comme des objets</p> | |
| </li> | |
| <li><p>Boxing</p> | |
| </li> | |
| <li><p>On ne peut "interroger un natif" que par un boxing</p> | |
| </li> | |
| <li><p>Transparent pour le programmeur</p> | |
| </li> | |
| <li><p>Boxing d'un int donne un Int</p> | |
| </li> | |
| <li><p>Boxing se cumule avec les containers</p> | |
| </li> | |
| </ul> | |
| <h1 id="exemple_de_boxing_"><a class="u" href="#___top" title="go to top of document">exemple de boxing </a></h1> | |
| <pre>> my int $i = 42 | |
| 42 | |
| > say $i | |
| 42 | |
| > $i.say # boxing pour utiliser la méthode .say | |
| 42 | |
| > $i.WHAT | |
| (Int) | |
| > $i.REPR | |
| P6opaque # classes Perl6 implémentées en terme de P6Opaque | |
| > </pre> | |
| <h1 id="type_valeur_et_type_référence_(1)"><a class="u" href="#___top" title="go to top of document">type valeur et type référence (1)</a></h1> | |
| <p>Un objet est un type référence. Il peut etre modifié si passé en argument et si mutable</p> | |
| <pre>class A { has $.a is rw }; | |
| sub foo(A $val) { $val.a = 42 } | |
| my $a = A.new; # A.new(a => Any ) | |
| a($a); | |
| say $a; # A.new(a => 42 )</pre> | |
| <p>17:10 timotimo m: my int $foo = 10; sub do-it(int $bar is rw) { say $bar.VAR.WHAT }; do-it($foo) 17:10 camelia rakudo-moar 7b2710: OUTPU<samp>(IntLexRef)</samp></p> | |
| <h1 id="type_valeur_et_type_référence_(2)"><a class="u" href="#___top" title="go to top of document">type valeur et type référence (2)</a></h1> | |
| <pre>sub foo(int $val) { $val = 42 }; | |
| Cannot assign to readonly variable $val</pre> | |
| <ul><li><p>$val est passé par référence et peut etre modifié</p> | |
| </li> | |
| </ul> | |
| <h1 id="passer_par_réference"><a class="u" href="#___top" title="go to top of document">passer par réference</a></h1> | |
| <pre>sub foo(int $val is rw) { $val = 42 }; my int $i = 0; foo($i) ; say $i | |
| foo(666) | |
| Expected a modifiable native int argument for '$val'</pre> | |
| <h1 id="égalité_et_identité"><a class="u" href="#___top" title="go to top of document">égalité et identité</a></h1> | |
| <p>Opérateurs binaires (arité 2)</p> | |
| <ul><li><p>=:= vrai identité</p> | |
| </li> | |
| <li><p>eqv équivalence </p> | |
| </li> | |
| <li><p>=== identité de valeur</p> | |
| </li> | |
| <li><p>== conversion des args à Num avant comparaison</p> | |
| </li> | |
| <li><p>eq conversion des args à Str avant comparaison</p> | |
| </li> | |
| </ul> | |
| <h1 id="opérateurs_sont_des_exemples_de_multi_subs"><a class="u" href="#___top" title="go to top of document">opérateurs sont des exemples de multi subs</a></h1> | |
| <ul><li><p>noms longs avec des paires adverbiales</p> | |
| </li> | |
| </ul> | |
| <pre>multi sub infix:<eq>(\a, \b) { a.Stringy eq b.Stringy } | |
| multi sub infix:<eq>(str $a, str $b) returns Bool:D { ... } | |
| ... | |
| multi sub infix:<==>(\a, \b) { a.Numeric == b.Numeric }</pre> | |
| <h1 id="pseudo_sigil_backslash"><a class="u" href="#___top" title="go to top of document">pseudo sigil backslash</a></h1> | |
| <pre>multi sub infix:<eq>(\a, \b) { a.Stringy eq b.Stringy }</pre> | |
| <ul><li><p>pseudo sigil \ => pas de containers</p> | |
| </li> | |
| </ul> | |
| <pre>> my \a = 1; | |
| 1 | |
| > say \a; | |
| \(1) | |
| > \a = 2; </pre> | |
| <pre>\(1) | |
| Cannot modify an immutable Capture | |
| in block <unit> at <unknown file> line 1</pre> | |
| <h1 id="Un_exemple_de_multisub"><a class="u" href="#___top" title="go to top of document">Un exemple de multisub</a></h1> | |
| <pre>multi quicksort( [ ] ) { () } | |
| multi quicksort( [$x ] ) { ($x) } | |
| multi quicksort( [$pivot, *@xs ] ) { | |
| quicksort(@xs.grep: * before $pivot), | |
| $pivot, | |
| quicksort(@xs.grep: * !before $pivot), | |
| }</pre> | |
| <h1 id="Quelques_exemples"><a class="u" href="#___top" title="go to top of document">Quelques exemples</a></h1> | |
| <pre>> 'ab' === 'a' ~ 'b' | |
| True | |
| > 'ab' eq 'a' ~ 'b' | |
| True | |
| > 'ab' =:= 'a' ~ 'b' | |
| False | |
| > 'ab' =:= 'ab' | |
| True | |
| > </pre> | |
| <h1 id="liage_dynamique_(binding)_et_affectation"><a class="u" href="#___top" title="go to top of document">liage dynamique (binding) et affectation</a></h1> | |
| <ul><li><p>Liage : lie un nom </p> | |
| </li> | |
| <li><p>Associe un nom à une valeur ou alias une variable.</p> | |
| </li> | |
| <li><p>Similaire à un typeglob Perl 5</p> | |
| </li> | |
| <li><p>nqp::bind</p> | |
| </li> | |
| <li><p>Affectation</p> | |
| </li> | |
| <li><p>multisub</p> | |
| </li> | |
| </ul> | |
| <pre>> my @a := 1, 2, 3; say @a.WHAT | |
| (List) | |
| > my @a := 1, 2, 3; my @b := @a; my $c := @a; say @a =:= @b =:= $c | |
| True | |
| > @a.VAR =:= @b.VAR =:= $c.VAR | |
| True | |
| > my @a = 1, 2, 3; say @a.WHAT | |
| (Array) | |
| for 1..20 { print $_, Int.new($_) =:= Int.new($_) ?? '' !! '!', ' ' } | |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15! 16! 17! 18! 19! 20! </pre> | |
| <h1 id="Immutabilité_et_conteneur"><a class="u" href="#___top" title="go to top of document">Immutabilité et conteneur</a></h1> | |
| <p>Une valeur immutable est une valeur qu'on ne peux pas modifier en place; càd sans changer son identité</p> | |
| <h1 id="Immutabilité_:_listes,_tableaux_(1)"><a class="u" href="#___top" title="go to top of document">Immutabilité : listes, tableaux (1)</a></h1> | |
| <p>Une liste est immutable. Un tableau ne l'est pas. Liage d'une lise à un Positional.</p> | |
| <pre>> my @a := 1, 2, 3 ; @a[0] = 4 | |
| Cannot modify an immutable Int | |
| in block <unit> at <unknown file> line 1 | |
| > @a.push: 4 | |
| Cannot call 'push' on an immutable 'List' | |
| in block <unit> at <unknown file> line 1 | |
| > @a.WHAT | |
| (List) | |
| > @a.push: 4 | |
| Cannot call 'push' on an immutable 'List' | |
| in block <unit> at <unknown file> line 1</pre> | |
| <p>Assignement d'une liste à un Positional</p> | |
| <pre>> my @a = 1, 2, 3 ; @a[0] = 42; @a | |
| [42 2 3]</pre> | |
| <h1 id="Immutabilité_:_listes,_tableaux_(2)"><a class="u" href="#___top" title="go to top of document">Immutabilité : listes, tableaux (2)</a></h1> | |
| <p>Mais les conteneurs d'une liste sont mutables</p> | |
| <pre>> my $a = 0; my @a = ($a, 1, 2 ) | |
| [0 1 2] | |
| > my $a = 0; my @a := ($a, 1, 2 ) | |
| (0 1 2) | |
| > @a[0] = 42 | |
| 42 | |
| > @a | |
| (42 1 2)</pre> | |
| <h1 id="Identité_de_conteneur"><a class="u" href="#___top" title="go to top of document">Identité de conteneur</a></h1> | |
| <pre>VAR($a) =:= VAR($b)</pre> | |
| <h1 id="déclaration_de_type"><a class="u" href="#___top" title="go to top of document">déclaration de type</a></h1> | |
| <pre>my int $value</pre> | |
| <pre>int : commence par une minuscule -> non objet | |
| Int : majustcule -> objet | |
| nqp | |
| > my int $a := 1 ; use nqp; say(nqp::isint($a)) | |
| 1 | |
| rakudo | |
| > my int $a := 1 ; use nqp; say(nqp::isint(nqp::decont($a))) | |
| 1</pre> | |
| <h1 id="Mu,_Any,_Junction,_Cool,_Failure,"><a class="u" href="#___top" title="go to top of document">Mu, Any, Junction, Cool, Failure,</a></h1> | |
| <ul><li><p>Mu : classe racine</p> | |
| </li> | |
| <li><p>Junction : valeur quantique, parallélisme potentiel</p> | |
| </li> | |
| <li><p>Any is Mu : racine de non Junction</p> | |
| </li> | |
| <li><p>Cool is Any :</p> | |
| </li> | |
| </ul> | |
| <h1 id="Junction"><a class="u" href="#___top" title="go to top of document">Junction</a></h1> | |
| <pre>> 1|2|3 == 3 | |
| False | |
| False | |
| True | |
| > ?(1|2|3 == 3) | |
| True | |
| > say ((1|2|3) == 3).WHAT | |
| (Junction)</pre> | |
| <p>> </p> | |
| <h1 id=".perl,_.gist,_.Str"><a class="u" href="#___top" title="go to top of document">.perl, .gist, .Str</a></h1> | |
| <ul><li><p>.Str convertit une valeur en chaîne</p> | |
| </li> | |
| <li><p>.gist même chose à usage humain</p> | |
| </li> | |
| <li><p>.perl code pour recréer la valeur</p> | |
| </li> | |
| </ul> | |
| <pre>> class A {}; my $a = A.new; | |
| A.new | |
| > use MONKEY-SEE-NO-EVAL; EVAL( $a.perl ) eqv $a</pre> | |
| <pre>True</pre> | |
| <h1 id=".perl,_.gist,_.Str_sur_classes_et_instances"><a class="u" href="#___top" title="go to top of document">.perl, .gist, .Str sur classes et instances</a></h1> | |
| <pre>> class A { has $.a }; my $a = A.new | |
| A.new(a => Any) | |
| > A.Str | |
| Use of uninitialized value of type A in string context | |
| Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed. | |
| > $a.Str | |
| A<86630344> | |
| > A.gist, $a.gist | |
| ((A) A.new(a => Any)) | |
| > A.perl, $a.perl | |
| (A A.new(a => Any))</pre> | |
| <h1 id=".perl,_.gist,_.Str_sur_un_match"><a class="u" href="#___top" title="go to top of document">.perl, .gist, .Str sur un match</a></h1> | |
| <pre>> 'ab' ~~ /(a) $<b>=b / | |
| 「ab」 | |
| 0 => 「a」 | |
| b => 「b」 | |
| > $/.Str | |
| ab | |
| > $/.gist | |
| 「ab」 | |
| 0 => 「a」 | |
| b => 「b」 | |
| > $/.perl # ci-dessous, j'ai raccourci la sortie | |
| Match.new(ast => Any, list => (Match.new(ast => Any, list => (), hash => Map.new(())...))</pre> | |
| <h1 id="Métamodèle"><a class="u" href="#___top" title="go to top of document">Métamodèle</a></h1> | |
| <ul><li><p>soubassement du système de classes de Perl 6</p> | |
| </li> | |
| <li><p>+ ou - autohébergé</p> | |
| </li> | |
| <li><p>macro .HOW pour accéder la métaclasse</p> | |
| </li> | |
| </ul> | |
| <pre>> Mu.HOW | |
| Perl6::Metamodel::ClassHOW.new | |
| > Mu.HOW.name(Mu) | |
| Mu | |
| > Mu.HOW.^name | |
| Mu | |
| > Mu.HOW.HOW.^name | |
| NQPClassHOW</pre> | |
| <h1 id="Métamodèle"><a class="u" href="#___top" title="go to top of document">Métamodèle</a></h1> | |
| <pre>> 42.^parents() | |
| () | |
| > 42.^parents(:all) | |
| ((Cool) (Any) (Mu)) | |
| > Mu.^methods | |
| (self sink ACCEPTS WHERE WHICH split take return-rw return WHY set_why Bool ... ) | |
| > Mu.^can('Str') | |
| (Str) | |
| > Mu.^can('Foobar') | |
| () | |
| > 1.^can('Str') | |
| (Str Str!b | |
| > 1.^can('Str')[0].WHAT | |
| (Method) | |
| > 1.^can('Str')[0].signature | |
| (Mu $: | is raw)</pre> | |
| <h1 id="Quelques_concepts_clé"><a class="u" href="#___top" title="go to top of document">Quelques concepts clé</a></h1> | |
| <ul><li><p>objet, classe, instance</p> | |
| </li> | |
| <li><p>concret, défini, vrai</p> | |
| </li> | |
| <li><p>mutable, container</p> | |
| </li> | |
| <li><p>sigil, twigil</p> | |
| </li> | |
| <li><p>role, itération</p> | |
| </li> | |
| <li><p>trait, attribut,</p> | |
| </li> | |
| <li><p>identité, égalité</p> | |
| </li> | |
| </ul> | |
| </body> | |
| </html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment