Skip to content

Instantly share code, notes, and snippets.

@cognominal
Created June 25, 2016 10:23
Show Gist options
  • Select an option

  • Save cognominal/4edd4ac61d39016291bc7aeffa59ab5c to your computer and use it in GitHub Desktop.

Select an option

Save cognominal/4edd4ac61d39016291bc7aeffa59ab5c to your computer and use it in GitHub Desktop.
prez.html
<!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&#39;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&#39;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 &#39; exit&#39; or &#39;^D&#39;
&gt; say &#39;Salut les mongueurs&#39;
Salut les mongueurs
&gt; &#39;Salut les mongueurs&#39;
Salut les mongueurs
&gt; my $a = &#39;salut&#39;
salut
&gt; $a
salut
&gt; class A {}
(A)
&gt; class A {}
Redeclaration of symbol A
&gt; $a
&gt; $a
Variable &#39;$a&#39; 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&#39;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 &quot;hello world&quot; # en public</p>
</li>
<li><p>/msg camelia m: say &quot;hello world&quot; # en privé</p>
</li>
<li><p>sur irc.perl.org #perlfr le bot s&#39;appelle p6eval</p>
</li>
<li><p>affichage explicite contrairement au REPL</p>
</li>
</ul>
<pre>si pas d&#39;IRC, hotspot &quot;iPhone de stephane&quot; &quot;larrywall&quot;</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&#39;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:&lt;is&gt;(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&#39;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&#39;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 &lt;=&gt; 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 &quot;salut $!qui&quot; }
}
$_ = Salut.new(:qui&lt;dude&gt;); # .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 &quot;salut $!qui&quot; }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&#39;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&#39;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 &quot;$quoi $!qui&quot; }
}
$_ = Salut.new(:qui&lt;dude&gt;);
.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&#39;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>&gt; class A { has $.a; has $!b }; A.^attributes
(Mu $!a Mu $!b)
&gt; say A.new( :a(1|2)).a.WHAT
(Junction)
&gt; 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&#39;attribut rw ou méthode lvalue ?</a></h1>
<p>Même interface pour l&#39;utilisateur</p>
<ul><li><p>l&#39;utilisateur d&#39;une classe n&#39;a pas à connaître ses attributs</p>
</li>
<li><p>détail d&#39;implémentation qui peut changer</p>
</li>
<li><p>même si attribut publique</p>
</li>
<li><p>la méthode .b remplace l&#39;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 =&gt; method () { say &#39;fetch&#39;; $!b },
STORE =&gt; method ($new) { say &#39;store&#39; $!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&#39;une valeur</p>
</li>
<li><p>.WHAT donne le type d&#39;une valeur</p>
</li>
<li><p>.VAR et .WHAT sont des macros</p>
</li>
</ul>
<pre>&gt; 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&#39;exemple</p>
<pre>my $foo := Proxy.new(
FETCH =&gt; -&gt; | { &quot;yo&quot; },
STORE =&gt; -&gt; | { });
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&#39;ont pas d&#39;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 &quot;interroger un natif&quot; que par un boxing</p>
</li>
<li><p>Transparent pour le programmeur</p>
</li>
<li><p>Boxing d&#39;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>&gt; my int $i = 42
42
&gt; say $i
42
&gt; $i.say # boxing pour utiliser la méthode .say
42
&gt; $i.WHAT
(Int)
&gt; $i.REPR
P6opaque # classes Perl6 implémentées en terme de P6Opaque
&gt; </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 =&gt; Any )
a($a);
say $a; # A.new(a =&gt; 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 &#39;$val&#39;</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:&lt;eq&gt;(\a, \b) { a.Stringy eq b.Stringy }
multi sub infix:&lt;eq&gt;(str $a, str $b) returns Bool:D { ... }
...
multi sub infix:&lt;==&gt;(\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:&lt;eq&gt;(\a, \b) { a.Stringy eq b.Stringy }</pre>
<ul><li><p>pseudo sigil \ =&gt; pas de containers</p>
</li>
</ul>
<pre>&gt; my \a = 1;
1
&gt; say \a;
\(1)
&gt; \a = 2; </pre>
<pre>\(1)
Cannot modify an immutable Capture
in block &lt;unit&gt; at &lt;unknown file&gt; 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>&gt; &#39;ab&#39; === &#39;a&#39; ~ &#39;b&#39;
True
&gt; &#39;ab&#39; eq &#39;a&#39; ~ &#39;b&#39;
True
&gt; &#39;ab&#39; =:= &#39;a&#39; ~ &#39;b&#39;
False
&gt; &#39;ab&#39; =:= &#39;ab&#39;
True
&gt; </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>&gt; my @a := 1, 2, 3; say @a.WHAT
(List)
&gt; my @a := 1, 2, 3; my @b := @a; my $c := @a; say @a =:= @b =:= $c
True
&gt; @a.VAR =:= @b.VAR =:= $c.VAR
True
&gt; my @a = 1, 2, 3; say @a.WHAT
(Array)
for 1..20 { print $_, Int.new($_) =:= Int.new($_) ?? &#39;&#39; !! &#39;!&#39;, &#39; &#39; }
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&#39;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&#39;est pas. Liage d&#39;une lise à un Positional.</p>
<pre>&gt; my @a := 1, 2, 3 ; @a[0] = 4
Cannot modify an immutable Int
in block &lt;unit&gt; at &lt;unknown file&gt; line 1
&gt; @a.push: 4
Cannot call &#39;push&#39; on an immutable &#39;List&#39;
in block &lt;unit&gt; at &lt;unknown file&gt; line 1
&gt; @a.WHAT
(List)
&gt; @a.push: 4
Cannot call &#39;push&#39; on an immutable &#39;List&#39;
in block &lt;unit&gt; at &lt;unknown file&gt; line 1</pre>
<p>Assignement d&#39;une liste à un Positional</p>
<pre>&gt; 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&#39;une liste sont mutables</p>
<pre>&gt; my $a = 0; my @a = ($a, 1, 2 )
[0 1 2]
&gt; my $a = 0; my @a := ($a, 1, 2 )
(0 1 2)
&gt; @a[0] = 42
42
&gt; @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 -&gt; non objet
Int : majustcule -&gt; objet
nqp
&gt; my int $a := 1 ; use nqp; say(nqp::isint($a))
1
rakudo
&gt; 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>&gt; 1|2|3 == 3
False
False
True
&gt; ?(1|2|3 == 3)
True
&gt; say ((1|2|3) == 3).WHAT
(Junction)</pre>
<p>&gt; </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>&gt; class A {}; my $a = A.new;
A.new
&gt; 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>&gt; class A { has $.a }; my $a = A.new
A.new(a =&gt; Any)
&gt; 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.
&gt; $a.Str
A&lt;86630344&gt;
&gt; A.gist, $a.gist
((A) A.new(a =&gt; Any))
&gt; A.perl, $a.perl
(A A.new(a =&gt; 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>&gt; &#39;ab&#39; ~~ /(a) $&lt;b&gt;=b /
「ab」
0 =&gt; 「a」
b =&gt; 「b」
&gt; $/.Str
ab
&gt; $/.gist
「ab」
0 =&gt; 「a」
b =&gt; 「b」
&gt; $/.perl # ci-dessous, j&#39;ai raccourci la sortie
Match.new(ast =&gt; Any, list =&gt; (Match.new(ast =&gt; Any, list =&gt; (), hash =&gt; 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>&gt; Mu.HOW
Perl6::Metamodel::ClassHOW.new
&gt; Mu.HOW.name(Mu)
Mu
&gt; Mu.HOW.^name
Mu
&gt; 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>&gt; 42.^parents()
()
&gt; 42.^parents(:all)
((Cool) (Any) (Mu))
&gt; Mu.^methods
(self sink ACCEPTS WHERE WHICH split take return-rw return WHY set_why Bool ... )
&gt; Mu.^can(&#39;Str&#39;)
(Str)
&gt; Mu.^can(&#39;Foobar&#39;)
()
&gt; 1.^can(&#39;Str&#39;)
(Str Str!b
&gt; 1.^can(&#39;Str&#39;)[0].WHAT
(Method)
&gt; 1.^can(&#39;Str&#39;)[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