Portál AbcLinuxu, 1. května 2025 05:52
my $a = '121'
tak na něj lze použít číselný operátor a naopak číslo můžeme přímo vypsat jako řetězec say $a + $a
.
my @a = ( 1, 2, 5, ); dd @a.Str; #"1 2 5" dd @a.Numeric; #3 -- počet prvků dd @a.so; #Bool::True dd @a.gist; #"[1 2 5]" dd @a.perl; #"[1, 2, 5]" my Str $a = '234'; dd $a.list; #("234",) dd $a.Numeric; #234 dd $a.so; #Bool::True dd $a.gist; #"234" dd $a.perl; #"\"234\"" my Rat $r = 22/7; dd $r.Str; #"3.142857" dd $r.perl; #"<22/7>" say ( '', 0 )>>.so, ().so; #(False False)False say @a + $a; #237 say @a ~ $r; #1 2 53.142857Zastavil bych se u
.gist
, který by měl reprezentovat řetězec v dobře čitelné formě pro lidi, a idea .perl
by měl být v řetězci Perl kódu, pomocí kterého přes EVAL
dostaneme původní hodnotu.
⊕
na celých číslech
sub infix:<⊕> ( Int $a, Int $b ) { $a + $b + 1; }Tento operátor vrátí požadovanou hodnotu, pokud oba parametry budou typu
Int
a jinak vyhodí chybu. Tedy můžeme použít 12 ⊕ 10
, ale už ne '12' ⊕ 23/12
. Perl 6 ale umí snadno řetězec '12'
i racionální číslo 23/12
interpretovat jako Int
. Náprava je snadná
multi sub infix:<⊕> ( Int $a, Int $b ) { $a + $b + 1; } multi sub infix:<⊕> ( Any $a, Any $b ) { $a.Int ⊕ $b.Int }(Použili jsme další mocnou zbraň Perlu 6 a to
multi
pro definici podprogramů.)
my $c = class { method Numeric { 42 }; method gist { 'čtyřicetdva' }; method Str { sprintf " %.2f ", self.Numeric }; }; say $c; #čtyřicetdva say $c + 12; #54 say $c ~ 'CZK'; # 42.00 CZKPokud bude chtít pouze pozměnit některý kontext můžeme to udělat pomocí
but
.
role length { method Numeric { self.chars } } my $s = 'ahoj' but length; say +$s; #4 my $m = '123'; say +$m; #123 my $n = '123' but length; say +$n; #3 my @p := []; say ?@p; #False my @q := [] but True; say ?@q; #True #pro zajímavost, berte prosím s rezervou, jednak je to šílenost a závisí to na implementaci my $o = 123 but length; say +$o; #3 say 0 + $o, -$o; #123-123
graph
, pomocí které budeme reprezentovat orientované grafy. (Třídu budu vypisovat po částech a nakonec uvedu kompletní definici třídy i s příklady a výstupem.)
Třída bude mít 2 atributy uzly a hrany,
class graph { has @.vertices; has @.edges;kde uzly budou bude pole názvů, např.
1, 2, 3
a hrany bude pole párů např. 1 => 2, 3 => 1,
. Definice pak bude vypadat, např. pro kompletní orientovaný graf na pěti uzlech, takto
my graph $k5 .= new: :vertices(^5), :edges( ^5 X=> ^5 );Všimněte si jak se lze v Perlu 6, pomocí
.=
vyhnout opakovanému napsání názvu třídy. Operátor X
je cross operátor, něco jako kartézský součin.
Dále definujme metodu gist
, pro lidsky vřelý řetězec. Vypíše 10 náhodných hran.
method gist { my @ge = @!edges.map({ .key ~ '→' ~ .value }); join ', ', @ge.elems <= 10 ?? @ge !! ( @ge.pick(10), '…' ); };Místo
@ge.elems <= 10
by jsme mohli napsat i @ge <= 10
, pamatujete na numerický kontext pole.
Nyní můžeme použít na objekt naši třídy say
say $k5; #2→3, 0→0, 0→3, 4→4, 4→2, 3→4, 2→4, 1→3, 0→4, 4→0, …A také definujme metody
Str
pro operace s řetězci a metodu perl
pro replikaci třídy pomocí Perlu 6.
Celý příklad
class graph { has @.vertices; has @.edges; method gist { my @ge = @!edges.map({ .key ~ '→' ~ .value }); join ', ', @ge.elems <= 10 ?? @ge !! ( @ge.pick(10), '…' ); }; method Str { join "\n", 'Vertices:', @!vertices.Str, 'Edges:', @!edges.join( "\n" ); }; method perl { [~] 'graph.new( ', :vertices( |@!vertices ).perl, ', ', :edges( |@!edges ).perl, ' )'; }; }; my graph $k5 .= new: :vertices(^5), :edges( ^5 X=> ^5 ); say 'gist:'; say $k5; say 'Str:'; put $k5; say 'perl:'; say $k5.perl; say 'Ověření perl:'; use MONKEY-SEE-NO-EVAL; say EVAL( $k5.perl );Výstup:
gist: 2→4, 2→3, 2→1, 3→1, 0→4, 1→4, 4→4, 0→3, 3→0, 0→0, … Str: Vertices: 0 1 2 3 4 Edges: 0 0 0 1 0 2 0 3 0 4 1 0 1 1 1 2 1 3 1 4 2 0 2 1 2 2 2 3 2 4 3 0 3 1 3 2 3 3 3 4 4 0 4 1 4 2 4 3 4 4 perl: graph.new( :vertices(slip(0, 1, 2, 3, 4)), :edges(slip(0 => 0, 0 => 1, 0 => 2, 0 => 3, 0 => 4, 1 => 0, 1 => 1, 1 => 2, 1 => 3, 1 => 4, 2 => 0, 2 => 1, 2 => 2, 2 => 3, 2 => 4, 3 => 0, 3 => 1, 3 => 2, 3 => 3, 3 => 4, 4 => 0, 4 => 1, 4 => 2, 4 => 3, 4 => 4)) ) Ověření perl: 0→1, 0→0, 0→2, 1→2, 3→2, 3→4, 0→3, 0→4, 2→0, 4→4, …
Tiskni
Sdílej:
+
použijeme jako operátor pro vlastní objekty. To jde v Perlu 6 snadno
multi sub infix:<+> ( graph $a, graph $b ) { $a.gist~ "\n" ~ $b.gist; } say $k5 + $k5;ale na to, když bychom chtěli předefinovat
+
, např. na Int
,
to mě Perl 6 vyhodil chybu s tím, že jsem příliš abiciózní.
Na Rat
to kupodivu prošlo
multi sub infix:<+> ( Rat $a, Rat $b ) { $a * $b } my Rat $a = 1/1; my Rat $b = 2/1; say $a + $b + 5; #7ale není těžké přijít na to, že to není dobrý nápad. Mimochodem původně jsem tam na místo
$a * $b
měl $a + $b + 1
a úspěšně jsem se dostal do nekonečné rekurze. Ten výsledek $a + $b + 5
, který je 7
, může být pro leckoho také překvapivý.
+
se vyjadřuji níže. Děkuji za ocenění. Já jsem zase rád, že někoho moje blogy potěšili.
Co se týká unicode, tak jsem zatím neplánoval udělat o něm díl. Nějak hlouběji jsem do toho zatím nepronikal. Samozřejmě jsem občas na to narazil např. prezentace Normal from grapheme. Za mě je zatím přínos o proti Perlu 5 to, že se vyhnu encode
a decode
. Na to, že bych se na některé věci s unicode (nejen v Perlu) neměl spoléhat, jsem se dozvěděl v diskuzi pod minulým článkem.
Co se týče smyslu Perlu 6, tak bych zkrátka řekl, že tvůrci a komunita (nebo alespoň část) Perlu, měla pocit, že je potřeba nový jazyk. Otázka je co znamená "pomoci dělat věci správně", jestli to znamená umožnit snadno dělat tyto věci, i třeba přesto, že půjdou snadno děla i věci špatně, nebo nějakým způsobem je vynucovat. Pro mě Perl 6 není jeden z mnoha.
tak bych zkrátka řekl, že tvůrci a komunita (nebo alespoň část) Perlu, měla pocit, že je potřeba nový jazyk.Byl to Tim O’Reilly, ktery potreboval dalsi knihy o Perlu (nejlepe novou verzi) a Larry Wall mu to slibil. Jenom se nejak nedohodli, jak dlouho to bude trvat.
X=>
, nebo ?? !!
. Budu rád, když to upřesníte, abych případně mohl reagovat.
⊕
jako binární operaci v různých strukturách a netušil jsem, že si to někdo bude automaticky spojovat s xor. Tak pokud je to matoucí, tak se omlouvám. Kdyby to bylo příliš matoucí tak to můžu v blogu změnit, popř. na to upozornit, ale to já nedokáži posoudit.
Nahradil jsem definici operátoru na celých číslechza
definici operátoru ⊕ na celých číslechtak snad už to bude jasnější.
',-,_
(ne samostatně) a nějaký druh mezer (ne na začátku).
Pro operátory taková omezení neplatí, přesně se mi to nepodařilo najít.
Raději pro představu ukáži pár příkladů co funguje
sub postfix:<γ> ($ ) { say "hi" }; my $απ='aa'; ($απ)γ; 'aa'γ; my \δ = 21; say δ; sub infix:<.⊕.> ( $α, $β ) { $α + $β; }; my $ĥoroj=12; my $ℵ=10; say $ĥoroj.⊕.$ℵ;
my $ℏ = 1.054571800e-34; # Funguje, jak má say $ℏ; my $μ̂ = 'zdar'; # Ostuda – nefunguje. Perl sucks, python rulez. say $μ̂ ;
my $ĉ=2; my &term:<μ̂> = { 'ahoj' }; constant aμ̂ = 'ahoj'; say $ĉ; say μ̂; say aμ̂;
my \μ̂ = 12; say μ̂; my $μ̂ = 13; say $μ̂;PS. čím ten znak píšeš zkoušel jsem compose i tex mod v emacsu a nepodařilo se :). Šipka nad písmenem se dá vypsat taky?
===SORRY!=== Error while compiling test2.pl6 Term definition requires an initializer at test2.pl6:1 ------> my \μ⏏̂ = 12; expecting any of: scoped declaratorAle možná to bude tím, že mám nějakou archaickou versi perlu6 (stabilní debian)
$ perl6 -v This is perl6 version 2014.07 built on parrot 6.6.0 revision 0Přiznám se, že vzhledem k častotě používání nemám žádný effektivní způsob psaní – většinou si to kopíruji myší z nějakého svého seznamu (na nějž jsem to dostal pomocí kcharselect).
perl6 -v This is Rakudo version 2016.03-86-g0e95cde built on MoarVM version 2016.03-84-g4afd7b6 implementing Perl 6.c.to funguje. Ale moc se v Unicode nevyznám, tak ti neřeknu zda to má jít podle té Sinopse.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.