Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!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>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement