Perl 6ããã³RakudoãPerl6仿§ããµããŒãããã³ã³ãã€ã©ãŒã®1ã€ã«é¢ããäžé£ã®èšäºã ãã®èšäºã¯2009幎ã®ããŒããããŸãšããããŠããŸããæ¥œå ãã€ã³ã¹ããŒã«ãã
çŸæç¹ã§ã¯ãPerl 6ã®äžå®å
šãªå®è£
ãããã€ããããŸãããããã®æãå®å
šãªãã®ã¯ã
Rakudoã³ã³ãã€ã©ã§ãïŒ
ããŠã³ããŒã ïŒã
GitãŠãŒã¶ãŒã¯ã次ã®ã³ãã³ãã䜿çšããŠã³ããŒãäœæã§ããŸãã
$ git clone git://github.com/rakudo/rakudo.git $ cd rakudo $ perl Configure.pl --gen-parrot --gen-moar --gen-nqp --backends=parrot,jvm,moar $ make $ make install
ãŸãã¯ã
github.com / rakudo / rakudo / tree / nomããããŠã³ããŒãããŠããœãŒã¹ããã³ã³ãã€ã«ããããšãã§ããŸã
Windowsçšã®æ¢è£œã®ãã€ããªã€ã³ã¹ããŒã©ãŒããããŸãã ã€ã³ã¹ããŒã©ãŒã®ããŒãžã§ã³ãšãœãŒã¹ã³ãŒãã¯
ãã¡ãããå
¥æã§ã
ãŸããperl6ã³ãã³ããå®è¡ãããšãããŸããŸãªèšèªã³ãã³ãã§éã¶ããšãã§ããREPLç°å¢ã«ãªããŸãã
$ perl6 > say "Hello world!"; Hello world! > say (10/7).WHAT (Rat) > say [+] (1..999).grep( { $_ % 3 == 0 || $_ % 5 == 0 } ); 233168
ã>ãã§å§ãŸãè¡ã¯ã³ãã³ãã§ãããæ®ãã¯ãã¹ãŠã·ã¹ãã å¿çã§ãã æåã®äŸã¯ãåçŽãªsayã¹ããŒãã¡ã³ãã§ãã 2çªç®ã¯æçæ°ãäœæãããã®ã¿ã€ãïŒRatïŒãèŠæ±ããŸãã 3çªç®ã®ãã®ã¯ã1ãã999ãŸã§ã®æ°åã®ãªã¹ããååŸãã3ãŸãã¯5ã§å²ãåããªãæ°åãé€å€ããããããå ç®ããŠçµæã衚瀺ããŸãã
ãã©ãŒãããã®çŸãã
ãã®èšäºã§ã¯ã.fmtã¡ãœãããèŠãŠãããŸãã
sprintfåœä»€ã«ç²ŸéããŠããå Žåã.fmtãæ±ãæ¹ãç°¡åã§ãã ããã§ãªãå ŽåããŸãã¯äœ¿ç𿹿³ãå¿ããå Žåã¯ãperldocããèªã¿ãã ããã ãã ããæ·±ãæãäžããã®ã§ã¯ãªããåç
§ããŠãã ããã
.fmt ããã䜿çšããŠæååãšæŽæ°ããã©ãŒãããããæ¹æ³ãããã€ã瀺ããŸãã
say 42.fmt('%+d')
è¯ãã§ãããä»ã®ãšããããã¯sprintfãæžãããã®çãæ¹æ³ã§ãã ãã ããé
åïŒããæ£ç¢ºã«ã¯ãªã¹ãïŒã§äœ¿çšãããšããã®ã¡ãœããã®åäœãç°ãªãããšãããããŸãã
say < >.fmt
ãããŠãããã·ã¥ïŒãããã³ã°ïŒã§ã®äœ¿çšã¯æ¬¡ã®ãšããã§ãã
say { foo => 1, bar => 2 }.fmt
ãã ããããã·ã¥ã®å Žåãçºè¡ã®é åºã¯äžèšãšç°ãªãå ŽåããããŸãã ãã¢çšã®.fmtããããŸãããããã·ã¥ãšåãããã«æ©èœããŸãã .fmtã¯ãå€ãŸãã¯å€ã®é
åã倿Žããç®çã®åœ¢åŒã«å€æããããã®äŸ¿å©ãªããŒã«ã§ãã sprintfã«äŒŒãŠããŸãããé
åã§ãæ©èœããŸãã å¯äžã®ãã€ãã¹ã¯ãã³ãŒããèªã¿ããããšããããšã§ãã æžã蟌ã¿å°çšèšèªãšããŠã®Perlã®è©å€ãå埩ããããã«ãã¯ãªã¹ãã¹ããªãŒã®1è¡æç»ãšããŠæ°å¹Žã®ãã¬ãŒã³ããçšæããŸããã
$ perl6 -e 'say " "x 9-$_,"#"x$_*2-1 for 0..9,2 xx 3'
Windowsã®ãªãã·ã§ã³ïŒä»ã®åŒçšç¬Šãå¿
èŠïŒïŒ
> perl6.exe -e "say ' 'x 9-$_,'#'x$_*2-1 for 0..9,2 xx 3"
éçåä»ããšãã«ããµã
Perl 5ã§ã¯ã$ã¹ã«ã©ãŒå€æ°ã«åç
§ãŸãã¯å€ãå«ããããšãã§ããŸãã å€ã¯äœã§ãæ§ããŸãã-æŽæ°ãæååãéæŽæ°ãæ¥ä»ã æå¿«ããç ç²ã«ããŠã®æè»æ§ã
Perl 6ã¯éçåä»ããå°å
¥ããŠããŸãã ç¹å®ã®ã¿ã€ãã®å€æ°ãå¿
èŠãªå Žåã¯ãåæåäžã«ãã®ã¿ã€ããæå®ããŸãã ããšãã°ãæŽæ°ãå«ã倿°ã¯æ¬¡ã®ãšããã§ãã
my Int $days = 24;
ä»ã®ã¿ã€ãã®äŸïŒ
my Str $phrase = " !"; my Num $pi = 3.141e0; my Rat $other_pi = 22/7;
å€ã圢åŒã®å€æ°ã䜿çšããã«ã¯ãã¿ã€ããæå®ããªãããã¿ã€ãAnyãæå®ããŸãã
ãã®ç« ã®2çªç®ã®ãããã¯ã¯ãã«ããµãã§ãã ããã¯ãç°ãªãå Žåã«åãååã䜿çšããŠããã·ãŒãžã£ããªãŒããŒããŒãããæ©äŒã§ãã 以äžã«äŸã瀺ããŸãã
multi sub identify(Int $x) { return "$x â ."; } multi sub identify(Str $x) { return qq<"$x" â .>; } multi sub identify(Int $x, Str $y) { return " $x \"$y\"."; } multi sub identify(Str $x, Int $y) { return " \"$x\" $y."; } multi sub identify(Int $x, Int $y) { return " - $x $y."; } multi sub identify(Str $x, Str $y) { return " - \"$x\" \"$y\"."; } say identify(42); say identify(" !"); say identify(42, " !"); say identify(" !", 42); say identify(" !", "!"); say identify(42, 24);
çµæïŒ
42 â . " !" â . 42 " !". " !" 42. - " !" "!". - 42 24.
ãã¹ãäž
perl-modulesã®äœæè
ã¯ãäžçã«ãªãªãŒã¹ããã¢ãžã¥ãŒã«ãäžé£ã®ãã¹ãã®æäŸã«æ
£ããŠããŸãã ãã®äŒçµ±ã¯ãç¹å®ã®æç€ºã«ããperl 6ã§ç¶æãããŠããŸãã
perlã§ãã¹ããèšè¿°ããå€å
žçãªæ¹æ³ã¯ãTest Anything Protocolã䜿çšããŠããŒã¿ãåºåããããšã§ãã ãã ããæåã§è¡ãå¿
èŠã¯ãããŸãã-ã¢ãžã¥ãŒã«ã䜿çšã§ããŸãã
éä¹é¢æ°ããããšããŸãïŒ
sub fac(Int $n) { [*] 1..$n }
ãããŸã§ã©ã®ããã«æ©èœãããã¯åé¡ã§ã¯ãããŸãããæ£ããæ©èœãããã©ãããç¥ãããã ãã§ãã 確èªããŸãããïŒ
use v6; sub fac(Int $n) { [*] 1..$n } use Test; plan 6; is fac(0), 1, 'fac(0) '; is fac(1), 1, 'fac(1) '; is fac(2), 2, 'fac(2) '; is fac(3), 6, 'fac(3) '; is fac(4), 24, 'fac(4) '; dies_ok { fac(' , ') }, ' ';
å®è¡ïŒ
$ perl6 fac-test.pl 1..6 ok 1 - fac(0) ok 2 - fac(1) ok 3 - fac(2) ok 4 - fac(3) ok 5 - fac(4) ok 6 -
詳现ïŒãã¹ãã䜿çšããŸãã ãã¹ãã¢ãžã¥ãŒã«ããã©ã³6ãããŒãããŸãã 6ã€ã®ãã¹ãã®éå§ãçºè¡šããŸãã æ¬¡ã«ããå
容ãããåä¿¡äºå®ããã説æãã®åœ¢åŒã§5è¡ããããŸãã isïŒïŒã¯æååãæ¯èŒããæŽæ°ã¯èªåçã«æååã«å€æãããããããã¹ãŠããŸããããŸãã
dies_ok {$ some_code}ã$ descriptionã®æåŸã§ãæŽæ°ä»¥å€ã®åŒæ°ã§é¢æ°ãåŒã³åºããšãšã©ãŒãçºçããããšã確èªããŸãã
ãã¹ãåºåã¯ã6ã€ã®ãã¹ããå®è¡ãããŠããããšã瀺ããåè¡ã«ãã¹ãçµæïŒOK-åæ Œããå ŽåãOK-倱æããå ŽåïŒããã¹ãçªå·ãããã³èª¬æã衚瀺ããŸãã
倿°ã®ãã¹ããéå§ãããšãã«ããã¹ãŠã詳现ã«è¡šç€ºããã®ã§ã¯ãªããçµæã衚瀺ããå¿
èŠããããŸãã proveã³ãã³ãã¯ãŸãã«ãããè¡ããŸãïŒ
prove --exec perl6 fac-test.pl fac-test.pl .. ok All tests successful. Files=1, Tests=6, 11 wallclock secs ( 0.02 usr 0.00 sys + 10.26 cusr 0.17 csys = 10.45 CPU) Result: PASS
ãã¹ããã¡ã€ã«ãå¥ã®t /ãã£ã¬ã¯ããªã«è¿œå ããæ¡åŒµåã.tã®ãã£ã¬ã¯ããªã®ãã¹ãŠã®ãã¡ã€ã«ã«å¯ŸããŠèšŒæãååž°çã«å®è¡ããã®ãäžè¬çã§ãã
prove --exec perl6 -rt
ãã®è¡ãMakefileã«å
¥ãããšãåã«make testãšå
¥åããŠãã¹ããå®è¡ã§ããŸãã
ã¡ã¿æŒç®å
å
ã«ãéä¹é¢æ°ã®è峿·±ãå®è£
ãèŠãŸããïŒ
sub fac(Int $n) { [*] 1..$n }
ããããããã¯ã©ã®ããã«æ©èœããŸããïŒ Perl 6ã«ã¯ããã匷åã«ãªã£ãŠããæ¢åã®æŒç®åã倿Žããããã€ãã®ã¡ã¿æŒç®åããããŸãã è§æ¬åŒ§ã¯ããªã¹ãã®ãã¹ãŠã®èŠçŽ éã®æ¬åŒ§å
ã«æå®ãããæŒç®åãé
眮ãããreduceã¡ã¿æŒç®åã§ãã äŸãã°
[+] 1, $a, 5, $b
ãšåãæå³
1 + $a + 5 + $b
ãããã£ãŠããªã¹ãã®èŠçŽ ãç°¡åã«èŠçŽã§ããŸãã
$sum = [+] @a;
ã»ãšãã©ãã¹ãŠã®æŒç®åã¯è§æ¬åŒ§å
ã«é
眮ã§ããŸãã
$prod = [*] @a;
ãããã£ãŠãéä¹ã§ã¯ãåŒ[*] 1 .. $ nã¯ã1ãã$ nãŸã§ã®ä¹ç®ãªã¹ãèŠçŽ ã®å€ãåããŸãã
å¥ã®ã¡ã¿æŒç®åã¯ãã€ããŒã§ãã æŒç®åã®é£ã«ããŸãã¯ãïŒãŸãã¯å¯Ÿå¿ããASCIIã®>>ãš<<ïŒãé
眮ããããšã«ããããªã¹ãã®ãã¹ãŠã®èŠçŽ ã§æ©èœããããã«ããŸãã ããšãã°ã次ã®åŒã¯ã@ aèŠçŽ ãš@bèŠçŽ ããã¢ã§è¿œå ããçµæã@cã«ããŸãã
@c = @a »+« @b;
Perl 5ã§ã¯ã次ã®ããã«æžããªããã°ãªããŸããã
for ($i = 0; $i < @a; $i++) { $c[$i] = $a[$i] + $b[$i]; }
hyperã¯ããŠãŒã¶ãŒå®çŸ©æŒç®åãå«ãããŸããŸãªæŒç®åã§äœ¿çšãããŸãã
é
åã®ä»£ããã«ãã¹ã«ã©ãŒã䜿çšã§ããŸãã
ãã¡ãããreduceãšhyperã¯çµã¿åãããããšãã§ããŸãïŒ
XïŒã¯ãã¹ïŒãRïŒãªããŒã¹ïŒãSïŒã·ãŒã±ã³ã·ã£ã«ïŒãªã©ãããã«å€ãã®ã¡ã¿æŒç®åããããŸãã äžè¬çã«ã+ =ã* =ãã=ãªã©ã®æŒç®åã¯ããã§ã«ã¡ã¿åœ¢åŒã®æŒç®åã§ãããããã«çå·ã远å ãããŠããŸãã
$a += 5;
ãã€ããŒã¹ããŒã¹ã«å
¥ã
ã¡ã¿æŒç®åã®ç ç©¶ãç¶ããåã«ãçŸãããã©ãŒãããããããªã¹ãã衚瀺ããè£å©é¢æ°lsayã玹ä»ããŸãã ãä»ããŠå®çŸ©ãããšãREPLç°å¢ã§äœ¿çšã§ããŸãã
our sub lsay(@a) { @a.perl.say }
ç°¡åãªãã®ããå§ããŸããããåãé·ãã®2ã€ã®ãªã¹ãã远å ããŸãã
> lsay (1, 2, 3, 4) <<+>> (3, 1, 3, 1) [4, 3, 6, 5] > lsay (1, 2, 3, 4) >>+<< (3, 1, 3, 1) [4, 3, 6, 5]
ãªã¹ãã®é·ããåãå Žåãäž¡æ¹ã®èšé²ãªãã·ã§ã³ã¯åãã§ãã ããããé·ããç°ãªãå ŽåïŒ
> lsay (1, 2, 3, 4) <<+>> (3, 1) [4, 3, 4, 5] > lsay (1, 2, 3, 4) >>+<< (3, 1)
ã«ãŒã«ã¯æ¬¡ã®ãšããã§ãããã€ããŒãªãã¬ãŒã¿ã®éã端ã瀺ããã®ã¯ããããä»ã®ç«¯ã«ãããã®ããçãå Žåãæ¡åŒµããããšãã§ããŸãã ãªã¹ãã®æåŸã®èŠçŽ ãç¹°ãè¿ãããšã«ãããæŽæ°ãè¡ãããŸãã ãéãããšã³ããã€ã³ããæããã®ã¯æŽæ°ã®å¯Ÿè±¡ã§ã¯ãããŸããã ããšãã°ãå·ŠåŽã®ã¿ïŒ<< + <<ïŒãå³åŽã®ã¿ïŒ>> + >>ïŒãäž¡åŽïŒ<< + >>ïŒããŸãã¯åŽé¢ãªãïŒ>> + <<ïŒã®å Žåããã¹ãŠã®çµã¿åãããå¯èœã§ãã ïŒ åäžã®ã¹ã«ã©ãŒãæ¡åŒµã§ããŸãã
> lsay (1, 2, 3, 4) >>+>> 2 [3, 4, 5, 6] > lsay 3 <<+<< (1, 2, 3, 4) [4, 5, 6, 7]
ãããã¯ããã€ããŒãªãã¬ãŒã¿ã䜿çšããåºæ¬ã§ãã ãŸããåŸçœ®æŒç®åãšå眮æŒç®åãšãšãã«äœ¿çšã§ããŸãã
> lsay ~<<(1, 2, 3, 4) ["1", "2", "3", "4"] > my @a= (1, 2, 3, 4); @a>>++; lsay @a; [2, 3, 4, 5]
ãããå¯èœã§ãïŒ
> lsay (0, pi/4, pi/2, pi, 2*pi)>>.sin [0, 0.707106781186547, 1, 1.22464679914735e-16, -2.44929359829471e-16] > lsay (-1, 0, 3, 42)>>.Str ["-1", "0", "3", "42"]
ãã®å Žå>>ã ãªã¹ãå
ã®åã¢ã€ãã ã§ã¡ãœãããåŒã³åºããŸãã
é
åãæžãããå Žå>>ãèšããªãããã以äžã¯å¿
èŠãããŸããã ãã€ããŒæŒç®åã®äœ¿çšã¯ãæäœã䞊åã«å®è¡ã§ããããšãæå³ãããªã¹ãäžã®æäœã®é åºã¯åºå®ãããŠããŸããã
ãã€ããŒæŒç®åã¯ãçµã¿èŸŒã¿æŒç®åã ãã§æ©èœããŸããã ç¬èªã®æŒç®åãå®çŸ©ã§ããŸãããŸããæŒç®åã䜿çšã§ããŸãã ã€ã³ãã¬ãŒã¹æŒç®åã§åäœããŸãïŒãã ãããŸã åäœããŸããïŒãããšãã°ãåœä»€@a >> / = >> 2ã¯é
åå
šäœã2ã§é€ç®ããå¿
èŠããããŸãããããã¯å€æ¬¡å
ãªã¹ããããªãŒãããã·ã¥ã§åäœããŸãã ãã€ããŒæŒç®åã®äœ¿çšã®è峿·±ãäŸã¯ãVectorã¯ã©ã¹ã§ãã
github.com/LastOfTheCarelessMen/Vector/blob/master/lib/Vector.pmããã¯ãåäžãµã€ã¯ã«ã®ãªã倿¬¡å
ãã¯ãã«ã®å®è£
ã衚ããŸãã
ãµã€ã¯ã«
ããã°ã©ããŒã¯ãã«ãŒããã©ãã»ã©äŸ¿å©ããç¥ã£ãŠããŸãã ã«ãŒãã䜿çšããäžè¬çãªäŸã¯ãé
åãèµ°æ»ããããã®foreachã«ãŒãã§ãã ããã¯ãŸãã«Perl 5ã§äœ¿çšããçš®é¡ã®ããŒã¯ãŒãã§ãããCã¹ã¿ã€ã«ã飿³ãããããã«äœ¿çšããããšãã§ããŸãã
Perl 6ã¯ç°ãªããŸãã
forããªã¹ãã®åãæž¡ãã«äœ¿çšãããããã«ãªããŸããã foreachã¯ããååšãããCã¹ã¿ã€ã«ã«ã¯wordã«ãŒãã䜿çšãããŸãã åœé¢ã¯ããã®èšèªã®æ°ããæè»ã§åŒ·åãªæ©èœã§ããæ¬¡ã®ãã®ã®ã¿ãèæ
®ããŸãã
for 1, 2, 3, 4 { .say }
ããã«ç®ç«ã€ã®ã¯ããªã¹ãã®åšãã«æ¬åŒ§ããªãããšã§ãã éåžžãPerl 6ã§ã¯ãPerl 5ãããå°ãªããã©ã±ãããå¿
èŠã§ããPerl5ã®ãããªããã©ã«ã倿°ã¯$ _ã§ãã 倿°ãæå®ããã«ã¡ãœãããåŒã³åºããšã¯ãã¡ãœãã$ _ãã€ãŸãããã®å Žåã¯$ _ãåŒã³åºãããšã§ãã åŒæ°ãªãã§sayã䜿çšããããšã¯ã§ããŸããã.sayãŸãã¯$ _ã®ãããããèšè¿°ããå¿
èŠããããŸãã
åçŽãªãããã¯ã®ä»£ããã«ããå°ã£ãããããã¯ã䜿çšããŠãã«ãŒã倿°ã®ååãæå®ã§ããŸãã
for 1, 2, 3, 4 -> $i { $i.say }
ãå°ã£ãããããã¯ã¯å¿åããã·ãŒãžã£ã«äŒŒãŠãããäŸå€ããã£ããããŸããã ãããŠããã®ãããªãããã¯å
ã«returnãèšè¿°ãããšããããåŒã³åºããããã·ãŒãžã£å
šäœãçµäºããŸãã ãã®ãããªãããã¯ã¯ãè€æ°ã®ãã©ã¡ãŒã¿ãŒãåããŸãã ãããŠã次ã®ããã«æžããšã©ããªããŸããïŒ
for 1, 2, 3, 4 -> $i, $j { "$i, $j".say }
èµ·åæã«ã以äžãåãåããŸãïŒ
1 2 3 4
ã€ãŸãããªã¹ãã調ã¹ãŠãäžåºŠã«2ã€ã®èŠçŽ ããœãŒãããŸãã ããã¯ãä»»æã®æ°ã®ãã©ã¡ãŒã¿ãŒã§æ©èœããŸãïŒå°ãªããšã1ã€ãããã³ããããªãå Žåã¯$ _ãæé»æå®ãããŸãïŒã ããŠãç§ãã¡ãçµéšããŠãããªã¹ããäœæããã®ã¯ã©ãã§ããïŒ ãã¡ãããé
å倿°ã䜿çšã§ããŸãã
for @array { .say }
ããããåçŽãªã±ãŒã¹ã§ã¯ã代ããã«mapã䜿çšã§ããŸãã
@array.map: *.say;
ãŸãã¯ãã·ãŒã±ã³ã¹ãç§ãã¡ã«ãšã£ãŠéèŠã§ãªãå Žåããã€ããŒãªãã¬ãŒã¿ïŒ
@array».say;
ããããç§ãã¡ã¯ä»ããã«ã€ããŠè©±ããŠããŸããã ã¹ãã³æŒç®å<..>ã䜿çšããŠãªã¹ããäœæã§ããŸãã
for 1..4 { .say }
å€ãã®å Žåã0ã§å§ãŸã$ nã®æ°åã®ãªã¹ããäœæããå¿
èŠããããŸãã0.. $ n-1ãæžãããã®ã£ããã³ã³ã¹ãã©ã¯ã¿ãŒ0 .. ^ $ nã䜿çšã§ããŸãããPerl 6ã§ã¯^ãã¬ãã£ãã¯ã¹ã䜿çšããæ¹æ³ãçããªããŸãã
for ^4 { .say }
åºåã§ã¯æ¬¡ã®ããã«ãªããŸãã
0 1 2 3
Cã¹ã¿ã€ã«ã®ã«ãŒãã䜿çšããçç±ã¯ãçŸåšã©ã®ãªã¹ãé
ç®ã䜿çšããŠããããç¥ãããããŸãã¯è€æ°ã®é
åãåæã«åŠçããå¿
èŠãããããã§ãã Perl 6ã«ã¯ãZïŒzipïŒã¹ããŒãã¡ã³ãã«ãããã®ããã®çããšã³ããªããããŸãã
for @array1 Z @array2 -> $one, $two { ... }
äž¡æ¹ã®é
åã®é·ããåãå Žåã$ oneã¯@ array1ã®ãã¹ãŠã®èŠçŽ ãééãã$ 2ã¯@ array2ã®ãã¹ãŠã®å¯Ÿå¿ããèŠçŽ ãééããŸãã é·ããç°ãªãå Žåããµã€ã¯ã«ã¯åæ¢ããæçã®çµããã«éããŸãã ãããã£ãŠã次ã®ãããªã«ãŒãã«é
åã€ã³ããã¯ã¹ãå«ããããšãã§ããŸãã
for ^Inf Z @array -> $index, $item { ... }
ç¡éã®ãªã¹ããããªãã®å¥œã¿ã«åããªãå ŽåïŒ
for ^@array.elems Z @array -> $index, $item { ... }
åãçµæã«ãªããŸãããæããšã¬ã¬ã³ããªãªãã·ã§ã³ã¯
for @array.kv -> $index, $item { ... }
array .kvã¯ããŒãšå€ãè¿ããé
åã®å ŽåãããŒã¯èŠçŽ ã®ã€ã³ããã¯ã¹ã«ãããŸããã
ãããã£ãŠãå°ãªããšã4ã€ã®é
åãåæã«åŠçã§ããŸãã
for @one Z @two Z @three Z @four -> $one, $two, $three, $four { ... }
ãã©ã¡ãŒã¿ãŒãš.combã®å¶é
éçåã倿°ã®å€ãå¶éããããã«ãå¶çŽã䜿çšãããšãããã·ãŒãžã£ãšã¡ãœããã®æäœãå¶åŸ¡ã§ããŸãã å€ãã®PLã§ã¯ããã©ã¡ãŒã¿ãããã·ãŒãžã£ã«æž¡ããåä¿¡ããå€ã確èªããå¿
èŠããããŸãã å¶éãããã°ãçºè¡šæã«ããã«æ€èšŒãè¡ãããšãã§ããŸãã äŸïŒå¶æ°ã¯å¿
èŠãããŸããã Perl 5ã§ã¯ã次ã®ããã«æžãããšãã§ããŸãã
sub very_odd { my $odd = shift; unless ($odd % 2) { return undef; }
Perl 6ã§ã¯ãããã·ã³ãã«ã«ããããšãã§ããŸãã
sub very_odd(Int $odd where {$odd % 2}) {
å¶æ°ã®ãã©ã¡ãŒã¿ãŒã§very_oddãåŒã³åºããšããšã©ãŒãçºçããŸãã 䟿å®äžãããã·ãŒãžã£ããªããŒãããŠãä»»æã®çªå·ãæäœã§ããŸãã
multi sub very_odd(Int $odd where {$odd % 2}) {
ãã©ã¡ãŒã¿å¶éã¯ã.combã¡ãœãããšçµã¿åãããŠäœ¿çšââãããšäŸ¿å©ã§ãã .combãšã¯äœã§ããïŒ ïŒæ«-æ«ïŒã é«ªã®æ¯ãšæ«ã®å Žåãé«ªã®æ¯ãåããŠé ã«çœ®ããŸãã .combã¯.splitã®å察ã§ãã æåŸã®æ¹æ³ã§ãäžèŠãªèŠçŽ ã§æååãåå²ã§ããå Žåã.combã¯å¿
èŠãªèŠçŽ ã§æååãåºåããŸãã 以äžã«ç°¡åãªäŸã瀺ããŸãã
say "Perl 6 Advent".comb(/<alpha>/).join('|'); say "Perl 6 Advent".comb(/<alpha>+/).join('|');
æåã®è¡ã¯ããP | e | r | l | A | d | v | e | n | tããçæããŸããåæåãååŸããŠäžæé
åã«å
¥ããã|ãã§çµåããŸãã 2è¡ç®ãåæ§ã«æ©èœããå¯èœãªéãæå€§æ°ã®æåãé£ç¶ããŠãã£ããã£ãããçµæã¯ãPerl | Adventãã«ãªããŸãã
ãã ãã.combã¯ã¯ããã«åŒ·åã§ãã ã¹ããªã³ã°ããšãããšãã¹ãã©ã³ããæäœã§ããŸãã ASCIIæååãããå Žåã¯ããã€ããŒæŒç®åã䜿çšããŠãåéšåãåçã®ASCIIæåã«çœ®ãæããããšãã§ããŸãã
say "5065726C36".comb(/<xdigit>**2/)».fmt("0x%s")».chr
ããã¯ã.mapã¡ãœããã䜿çšããŠèšè¿°ã§ããŸãã
say "5065726C36".comb(/<xdigit>**2/).map: { chr '0x' ~ $_ } ;
ãã€ãã®ããã«ãäœããããæ¹æ³ã¯è€æ°ãããŸãã
ãã ããã¿ã¹ã¯ã¯ããè€éã§ãããã©ã¡ãŒã¿ã.combããã³.mapã®å¶éãéããŠãå€ä»£ã®
ã·ãŒã¶ãŒæå·ã玹ä»ããŸã
use v6; sub rotate_one( Str $c where { $c.chars == 1 }, Int $n ) { return $c if $c !~~ /<alpha>/; my $out = $c.ord + $n; $out -= 26 if $out > ($c eq $c.uc ?? 'Z'.ord !! 'z'.ord); return $out.chr; } sub rotate(Str $s where {$s.chars}, Int $n = 3) { return ($s.comb.map: { rotate_one( $_, $n % 26 ) }).join( '' ); } die ":\n$*PROGRAM_NAME _" unless @*ARGS == 2; my Str $mess = @*ARGS[0]; my Int $rotate = @*ARGS[1].Int; say qq|"$mess" $rotate "{rotate($mess,$rotate)}".|;
çŸããåŒæ°ãšãªãã·ã§ã³
Perl 5ã§ã¯ããã©ã¡ãŒã¿ãŒã®æäœã¯@_ãä»ããŠæ§ç¯ãããŸãã
sub sum { [+] @_ } say sum 100, 20, 3;
[+]-Perl 6ããã®åœä»€ã§ãããæžãå Žå
my $i = 0; $i += $_ for @_; $i
ããã¯Perl 5ã§ãæ©èœããŸããPerl6ã§ã¯ãPerl 5ãšåæ§ã«ãããã·ãŒãžã£ã«æž¡ããããã©ã¡ãŒã¿ãŒã«@_é
åãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã ã·ã¹ãã ã¯éåžžã«æè»ã§ããã©ã¡ãŒã¿ãŒã«å¶éã課ããŸããã ããããããã¯ãç¹ã«ä»¥äžã確èªããå¿
èŠãããå Žåãããªãéå±ãªããã»ã¹ã§ãã
sub grade_essay { my ($essay, $grade) = @_; die ' Essay' unless $essay ~~ Essay; die ' 0 5' unless $grade ~~ Int && $grade ~~ 0..5; %grades{$essay} = $grade; }
Perl 5ã§ã¯ã~~ã®ä»£ããã«isaãïŒ
gradesã®ä»£ããã«$ gradesãæžãå¿
èŠããããŸããããããã ãã§ãã ä»åºŠã¯ãæåãã§ãã¯ãäœåè¡ãå¿
èŠãããããèŠãŠãã ããã æããŸããïŒ ããã ãã§ãã
Perl 5ã§ã¯ãSub :: SignaturesãMooseX :: Declareãªã©ãCPANãåããããŸããŸãªäŸ¿å©ãªã¢ãžã¥ãŒã«ããããè¡ããŸãã
ä»ã®ã¡ãœããã¯Perl 6ã§å©çšå¯èœã§ãã ããšãã°ããã®äŸã¯æ¬¡ã®ããã«æžãããšãã§ããŸãã
sub grade_essay(Essay $essay, Int $grade where 0..5) { %grades{$essay} = $grade; }
ãã1ã€ããµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ã¯ãããŸããã ããã©ã«ãå€ãèšå®ãããšäŸ¿å©ãªå ŽåããããŸãã
sub entreat($message = ' !', $times = 1) { say $message for ^$times; }
ãããã®å€ã¯å®æ°ã§ããå¿
èŠã¯ãããŸããããåã®ãã©ã¡ãŒã¿ãŒãå«ããããšãã§ããŸãã
sub xml_tag ($tag, $endtag = matching_tag($tag) ) {...}
ããã©ã«ãå€ãæå®ãããŠããªãå Žåã¯ããã©ã¡ãŒã¿ãŒããªãã·ã§ã³ã®çå笊ãšããŠããŒã¯ããŸãã
sub deactivate(PowerPlant $plant, Str $comment?) { $plant.initiate_shutdown_sequence(); say $comment if $comment; }
ç¹ã«ã¯ãŒã«ãªã®ã¯ããã©ã¡ãŒã¿ãŒãååã§åç
§ããä»»æã®é åºã§æž¡ãããšãã§ããããšã§ãã ãã©ã¡ãŒã¿ãŒã®ã·ãŒã±ã³ã¹ãæãåºããŸããã§ããã
sub draw_line($x1, $y1, $x2, $y2) { ... } draw_line($x1, $y1, $x2, $y2);
ãããŠãååã§ããããåç
§ã§ããŸãïŒ
draw_line(:x1($x1), :y1($y1), :x2($x2), :y2($y2));
ã³ãã³ã¯ãååä»ããã©ã¡ãŒã¿ãŒãååšãããããšãæå³ãããã¹ãŠäžç·ã«ãªããŸãïŒparameter_nameïŒ$ passed_variableïŒã ãã©ã¡ãŒã¿ãŒãšå€æ°ã®ååãäžèŽããå Žåãçã衚èšã䜿çšã§ããŸãã
draw_line(:$x1, :$y1, :$x2, :$y2);
APIã®äœæè
ããã¹ãŠã®äººã«ååä»ããã©ã¡ãŒã¿ãŒã䜿çšããããšãæãå Žåã颿°å®£èšã§ã³ãã³ãæå®ããå¿
èŠããããŸãã
sub draw_line(:$x1, :$y1, :$x2, :$y2 ) { ... }
ååä»ããã©ã¡ãŒã¿ãŒã¯ããã©ã«ãã§ã¯ãªãã·ã§ã³ã§ãã ã€ãŸããäžã®äŸã¯æ¬¡ã®äŸãšåçã§ãã
sub draw_line(:$x1?, :$y1?, :$x2?, :$y2?) { ... }
ãã©ã¡ãŒã¿ãŒãå¿
é ã«ããå¿
èŠãããå Žåã¯ãæå笊ã䜿çšããŸãã
sub draw_line(:$x1!, :$y1!, :$x2!, :$y2!) { ... }
ä»ããããã転éããå¿
èŠããããŸãã
å¯å€æ°ã®ãã©ã¡ãŒã¿ãŒã¯ã©ãã§ããïŒ ç°¡åïŒãã©ã¡ãŒã¿ãŒãã¢ã¹ã¿ãªã¹ã¯ãåã«ä»ããé
åã«ããïŒ
sub sum(*@terms) { [+] @terms } say sum 100, 20, 3;
future颿°ã®ãã©ã¡ãŒã¿ãŒã«å¶éãèšå®ããªãå Žåãããã©ã«ãã®å¶é* @_ãåãåããŸãã ãããæå³ããã®ã¯ãå¶éã®æ¬ åŠããŸãã¯Perl 5ã®åäœã®ãšãã¥ã¬ãŒã·ã§ã³ã§ãã
ãã ããæã®ããé
åã¯ç¹å®ã®é åºã§ã®ã¿ãã©ã¡ãŒã¿ãŒãåãåããŸãã ååä»ããã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠãããå Žåã¯ãããã·ã¥ã䜿çšããŸãã
sub detect_nonfoos(:$foo!, *%nonfoos) { say " 'foo' ", %nonfoos.keys.fmt("'%s; } detect_nonfoos(:foo(1), :bar(2), :baz(3));
ããã·ã¥ã®æ¹æ³ã§ååä»ããã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããããšã«æ³šæããŠãã ããïŒ
detect_nonfoos(foo => 1, bar => 2, baz => 3);
Perl 5ãšã®å¥ã®éãïŒããã©ã«ãã§ã¯ããªãã·ã§ã³ã¯èªã¿åãå°çšã§ãïŒ
sub increase_by_one($n) { ++$n } my $value = 5; increase_by_one($value);
1ã€ã®çç±ã¯å¹çã§ãã èªã¿åãå°çšå€æ°ã®ãããªãªããã£ãã€ã¶ãŒã 2ã€ç®ã¯ãããã°ã©ããŒã«æ£ããç¿æ
£ãè²ãŠãããšã§ãã 颿°åããã°ã©ãã³ã°ã¯ããªããã£ãã€ã¶ãŒãšéã®äž¡æ¹ã«é©ããŠããŸãã
äžçªäžã®äŸãæ©èœãããã«ã¯ã次ã®ããã«èšè¿°ããå¿
èŠããããŸãã
sub increase_by_one($n is rw) { ++$n } my $value = 5; say increase_by_one($value);
ããã¯æ©èœããå ŽåããããŸããããã©ã¡ãŒã¿ãŒã®ã³ããŒã倿Žããæ¹ãç°¡åãªå ŽåããããŸãã
sub format_name($first, $middle is copy, $last) { $middle .= substr(0, 1); "$first $middle. $last" }
å
ã®å€æ°ã¯å€æŽãããŸããã
Perl 6ã§ã¯ãé
åãŸãã¯ããã·ã¥ãæž¡ããšããã©ã«ãã®åŒæ°ã調æŽãããŸããã 代ããã«ãäœçœ®åããã匷å¶ããã«ã¯ãã|ãã䜿çšããŸãã
sub list_names($x, $y, $z) { "$x, $y and $z" } my @ducklings = <huey dewey louie>; try { list_names(@ducklings); } say $!;
ããã·ã¥ãæŽåããããšããã®å
容ã¯ååä»ããã©ã¡ãŒã¿ãŒã®åœ¢åŒã§è»¢éãããŸããé
åãšããã·ã¥ã«å ããŠãã³ãŒããããã¯ã転éããããšãã§ããŸãã sub traverse_inorder(TreeNode $n, &action) { traverse_inorder($n.left, &action) if $n.left; action($n); traverse_inorder($n.right, &action) if $n.right; }
3ã€ã®æåãã¿ã€ããªããã¿ãŒãšããŠæ©èœããŸãã@é
åïŒäœçœ®ïŒïŒ
ããã·ã¥ïŒé£æ³ïŒïŒã³ãŒãïŒåŒã³åºãããïŒ$-å¶éãªãã®ãã©ã¡ãŒã¿ãŒãåã2åå²ãåœãŠãããšãããšããtrapã«é¥ããªãã§ãã ãã-ååãšèšå·ã䜿çšããŠïŒ sub f(Array @a) { ... }
ãããŸã§èªãã ãããã1ã€ã®ã©ã€ããŒã«å€ããŸãã $ perl6 -e '.fmt("%b").trans("01" => " #").say for <734043054508967647390469416144647854399310>.comb(/.**7/)'
ã¬ã®ã¥ã©ãŒã¹ããŒãªãŒ
æã¯ããã»ã©é ããªãçåœã§ããã£ã ãšããååã®Perl 6ã®åŠçãç°¡åãªè§£æã®åé¡ã«åãçµã¿ãŸãããäžåžã§ããCæ°ã¯ãæå¹ãªè¡ã®ã¿ãå«ãŸããŠããããšã確èªããããã«ãã€ã³ãã³ããªæ
å ±ãå«ããã°ã«ã€ããŠåœŒãè§£æããŸãããæå¹ãªæååã¯æ¬¡ã®ããã«ãªããŸãã < > <> < > <>
åžžé£ã«å°ã粟éããŠããåŠçã¯ã蚱容ãããç·ã決å®ããããã®çŸããåžžé£ãæžããŸãããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããã next unless $line ~~ / ^^ \d+ \s+ \d+ \s+ \S+ \s+ \N* $$ /
~~æŒç®åã¯ãå·ŠåŽã®ã¹ã«ã©ãŒã«é¢ããŠå³åŽã®èŠåæ§ããã§ãã¯ããŸããã¬ã®ã¥ã©ãŒã·ãŒãºã³ã§ã¯ã^^ã¯è¡ã®å§ãŸãã\ d +-å°ãªããšã1æ¡ã\ S +-å°ãªããšã1ã€ã®éç©ºçœæåã\ N *æ¹è¡ä»¥å€ã®ä»»æã®æ°ã®æåã\ s +ã¹ããŒã¹ãããã³$$è¡æ«ãæå³ããŸãã Perl 6ã§ã¯ããããã®æåãèªã¿ãããããããã«ã¹ããŒã¹ã§åºåãããšãã§ããŸãããããŠãã¹ãŠãçŽ æŽãããã£ãããããããã®åŸãCæ°ã¯ãã°ããæ
å ±ãæœåºããã ãã§ãªããããããã§ãã¯ããã®ãè¯ããšå€æããŸããããã£ã ã¯åé¡ã¯ãªããšæã£ãŠããšããµã€ãã£ã³ã°ãªãã©ã±ããã远å ããŸãããã ãã圌ã¯ïŒ next unless $line ~~ / ^^ (\d+) \s+ (\d+) \s+ (\S+) \s+ (\N*) $$ /
詊ååŸãè§æ¬åŒ§ã®åãã¢ã®å
容ã¯ããšã³ããª$ / [0]ã$ [1]ãªã©ããã¢ã¯ã»ã¹ã§ããŸãããŸãã¯ã倿°$ 0ã$ 1ã$ 2ãªã©ãéããŠãã£ã ã幞ãã§ãããCããããããããã®åŸãããã€ãã®ç·ã§ã¯è²ã説æããåé¢ãããŠããªãããšã倿ããŸããããã®ãããªè¡ã¯æ¬¡ã®ããã«èŠããŸããã <part number> <quantity> <description> (<color>)
ããã«ã説æã«ã¯ã¹ããŒã¹ãå«ãä»»æã®æ°ã®æåãå«ããããšãã§ããŸããããªããºãããã£ã ã¯ãã¿ã¹ã¯ãéåžžã«è€éã«ãªã£ããšæã£ãïŒãããããã£ã ã¯ã¢ããã€ã¹ãæ±ããå Žæãç¥ã£ãŠããŸããã圌ã¯ããã«ãã£ã³ãã«ïŒperl6ã®irc.freenode.orgã«è¡ããããã§å°ããŸããã誰ããã¬ã®ã¥ã©ãŒã·ãŒãºã³ã®åéšã«ååãä»ããŠãäœæ¥ããããããããã¹ãŠã®å¯èœãªä»£æ¿åããã£ããããããã«äº€äºã«äœ¿çšããããšãå§ããŸãããæåããã£ã ã¯ã¬ã®ã¥ã©ãŒã·ãŒãºã³ã®åéšã«ååãä»ããããšããŸãããPerl 6ã®åžžé£ã®èª¬æãèŠãŠããã£ã ã¯ãã®ãããªãšã³ããªãäœæã§ããããšãçºèŠããŸããã next unless $line ~~ / ^^ $<product>=(\d+) \s+ $<quantity>=(\d+) \s+ $<color>=(\S+) \s+ $<description>=(\N*) $$ /
ãããŠãèŠã€ããåŸãã¬ã®ã¥ã©ãŒã·ãŒãºã³ã®ããŒã¹ã¯ãããããªããžã§ã¯ããŸãã¯å€æ°$ã$ã$ã$ãä»ããŠå©çšã§ããŸããããã¯ç°¡åã§ããã£ã ã¯å
æ°ã«ãªããŸãããæ¬¡ã«ãäž¡æ¹ã®åç·ãªãã·ã§ã³ããã¹ãã«åæ Œããããã«ã亀æ¿ã远å ããŸããã next unless $line ~~ / ^^ $<product>=(\d+) \s+ $<quantity>=(\d+) \s+ [ | $<description>=(\N*) \s+ '(' $<color>=(\S+) ')' | $<color>=(\S+) \s+ $<description>=(\N*) ] $$ /
亀äºãã¬ã®ã¥ã©ãŒã·ãŒãºã³ã®æ®ãããåé¢ããããã«ããã£ã ã¯ã°ã«ãŒãåãããè§æ¬åŒ§ã§åœŒå¥³ãå²ã¿ãŸããããããã®æ¬åŒ§ã¯ãäžžæ¬åŒ§ã®ããã«æ£èŠã®éšåãåé¢ããŸãããåé¢ãããéšåã$ 0倿°ãªã©ã«è¿ããŸããããã¡ã€ã«å
ã®æ¬åŒ§ããã£ããããå¿
èŠããããããTimã¯Perl 6ã®å¥ã®äŸ¿å©ãªæ©èœãå©çšããŸãããåŒçšç¬Šã§å²ãŸãããã®ã¯ãããã¹ãã§ãã®ãŸãŸæ€çŽ¢ãããŸãããã£ã ã¯å±ãŸãããŸããã圌ã¯Cæ°ã«ã³ãŒããèŠããŠãããŠã圌ãåºæ¿ãåããŸããïŒ ããããã£ãããã£ã ïŒãCæ°ã¯èšã£ãã誰ãã幞ãã§ããã£ã ã¯èªããæã£ãŠèŒããããããããã®åŸã圌ã¯äœåãæ¹å€çã«èŠãŸãããäžéšã®ã©ã€ã³ã§ã¯ãè²ã¯ãïŒcolorïŒããŸãã¯ãïŒcolorïŒããŸãã¯ãïŒcolorïŒãã«èšå®ãããŸããçµæãšããŠãèŠåæ§ã¯ãã®ãããªè²ã説æã«å²ãåœãŠãŸãããã$倿°ããŸã£ããèšå®ããŸããã§ãããããã¯åãå
¥ããããŸããã§ããã Timã¯ã¬ã®ã¥ã©ãŒã·ãŒãºã³ãæžãçŽãã\ s *ã远å ããŸããïŒ next unless $line ~~ / ^^ $<product>=(\d+) \s+ $<quantity>=(\d+) \s+ [ | $<description>=(\N*) \s+ '(' \s* $<color>=(\S+) \s* ')' | $<color>=(\S+) \s+ $<description>=(\N*) ] $$ /
ããã¯ããŸããããŸããããã¬ã®ã¥ã©ãŒã¯åä»ã«èŠãå§ããŸããããããŠãTimã¯ãã£ã³ãã«ïŒperl6ã«æ»ããŸãããä»åãPerlJamãšããååã®ãŠãŒã¶ãŒã¯æ¬¡ã®ããã«è¿°ã¹ãŸãããããªãããªãã¯æ®éã®ææ³ãææ³ã«å
¥ããªãã®ã§ããïŒçµå±ã®ãšãããå®éã«ã¯ãããè¡ã£ãŠãããå倿°ã«ç¬èªã®å€æ°ãå²ãåœãŠãŠããŸããã·ãŒã«ãïŒãã£ã ã¯èããã圌ã¯ãPerlJamãäœã«ã€ããŠè©±ããŠããã®ãåãããŸããã§ãããçãäŒè©±ã®åŸããã£ã ã¯æå³ãçè§£ããããã§ããŠãŒã¶ãŒã«æè¬ããã³ãŒããæžãããã«åº§ã£ããä»åãèŠåæ§ã¯æ¶ããææ³ã«å€ãããŸããã圌女ã®å§¿ã¯æ¬¡ã®ãšããã§ãã grammar Inventory { regex product { \d+ } regex quantity { \d+ } regex color { \S+ } regex description { \N* } regex TOP { ^^ <product> \s+ <quantity> \s+ [ | <description> \s+ '(' \s* <color> \s* ')' | <color> \s+ <description> ] $$ } }
ãŸãããã£ã ã¯ãä»åã¯ãã¹ãŠãããŸãæŽçãããŠãããšæã£ããéå»ã®å倿°ã¯ãææ³å
ã§ç¬èªã®èŠåæ§ã«ãªããŸãããPerl 6ã¬ã®ã¥ã©ãŒã§ã¯ãååä»ãã¬ã®ã¥ã©ãŒãå±±æ¬åŒ§ã§å²ãŸããŠãã¹ãã«è¿œå ãããŸããGrammar.parseãã¹ã«ã©ãŒã§åŒã³åºãå Žåãç¹å¥ãªTOPã¬ã®ã¥ã©ãŒã䜿çšãããŸããåäœã¯åãã§ã-åŒã®èŠã€ãã£ãéšåã¯ååä»ã倿°ã«æ ŒçŽãããŸããå®ç§ã«å¶éã¯ãããŸãããããã£ã ãšãã¹ã¿ãŒCã¯çµæã«éåžžã«æºè¶³ããŠããŸãããããïŒã¯ã©ã¹ã屿§ãã¡ãœããããã®ä»
æ°ããPerl 6ãªããžã§ã¯ãã¢ãã«ã§ã¯ã©ã¹ãèšè¿°ããæ¹æ³ïŒ class Dog { has $.name; method bark($times) { say "w00f! " x $times; } }
classããŒã¯ãŒãããå§ããŸããPerl 5ãç¥ã£ãŠãã人ã«ãšã£ãŠã¯ããã®ã¯ã©ã¹ã¯ããã±ãŒãžã«å€å°äŒŒãŠããŸããããããã«äœ¿ããããšããæå³ã®å¯èœæ§ããããããããŸããæ¬¡ã«ãhasããŒã¯ãŒãã䜿çšããŠãã¢ã¯ã»ãµãŒã¡ãœãããæã€å±æ§ã宣èšããŸããã$ãšnameã®éã®ãã€ã³ãã¯ã倿°ã«ã¢ã¯ã»ã¹ããæ©èœã«ã€ããŠå ±åãããã³ã»ããã§ããTwigil-dotã¯ã屿§+ã¢ã¯ã»ãµãŒããæå³ããŸãããã®ä»ã®ãªãã·ã§ã³ïŒ has $!name;
次ã«ãã¡ãœããã¯methodããŒã¯ãŒããä»ããŠå®£èšãããŸããã¡ãœããã¯ãã¯ã©ã¹ã¡ãœããããŒãã«ã«ç¬èªã®ãšã³ããªãããã ãã®ããã·ãŒãžã£ã«äŒŒãŠããŸãã$ selfãä»ããŠåŒã³åºãããšãã§ããŸãããã¹ãŠã®ã¯ã©ã¹ã¯ãååä»ããã©ã¡ãŒã¿ãŒã屿§ã«å²ãåœãŠãnewãšããååã®ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãç¶æ¿ããŸããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããã«ã¯ã次ã®ããã«èšè¿°ã§ããŸãã my $fido = Dog.new(name => 'Fido'); say $fido.name;
ã¡ãœããåŒã³åºãã¯ãPerl 5ã§ã¯ç¢å°ã®ä»£ããã«ãããã䜿çšããŠè¡ãããŸãã50ïŒ
çããä»ã®èšèªã®ããã°ã©ããŒã«éŠŽæã¿ããããŸãããã¡ãããç¶æ¿ããããŸããããã¯ãåç¬ã¯ã©ã¹ãäœæããæ¹æ³ã§ãã class Puppy is Dog { method bark($times) { say "yap! " x $times; } }
å§ä»»ããããŸãïŒ class DogWalker { has $.name; has Dog $.dog handles (dog_name => 'name'); } my $bob = DogWalker.new(name => 'Bob', dog => $fido); say $bob.name;
ããã§ã¯ãDogWalkerã¯ã©ã¹ã®dog_nameã¡ãœããã®åŒã³åºããDogã¯ã©ã¹ã®nameã¡ãœããã«ãªãã€ã¬ã¯ããããããšã宣èšããŸãããã®ãã¹ãŠã®çŸããã®å±€ã®äžã«ãã¡ã¿ã¢ãã«ããããŸããã¯ã©ã¹ã屿§ãããã³ã¡ãœããã¯ãã¡ã¿ãªããžã§ã¯ããéããŠè¡šãããŸããããã¯ãå®è¡æã«ãªããžã§ã¯ããæäœããæ¹æ³ã§ãã for Dog.^methods(:local) -> $meth { say "Dog has a method " ~ $meth.name; }
ã^æŒç®åã¯ãªãã·ã§ã³ã§ãããã ããã¡ã¿ã¯ã©ã¹ïŒã¯ã©ã¹ã衚ããªããžã§ã¯ãïŒãåŒã³åºããŸããããã§ãã¯ã©ã¹ã§å®çŸ©ãããŠããã¡ãœããã®ãªã¹ããæäŸããããã«åœŒã«äŸé ŒããŸãïŒããŒã«ã«ã¯ä»ã®ã¯ã©ã¹ããç¶æ¿ãããã¡ãœãããé€å€ããŸãïŒããããŠãååã®ãªã¹ãã ãã§ãªããMethodãªããžã§ã¯ãã®ãªã¹ããååŸããŸãããã®æ¹æ³ã§ã¡ãœããèªäœãåŒã³åºãããšãã§ããŸããããã®å Žåã¯åã«ååã衚瀺ããŸããPerl 6æ§æãæ¡åŒµãããã¡ã¿ããã°ã©ãã³ã°æå¥œå®¶ã¯ãmethodããŒã¯ãŒãã䜿çšãããšãå®éã«add_methodãã¡ã¿ã¯ã©ã¹ããåŒã³åºãããããšãç¥ã£ãŠè奮ããŸãããããã£ãŠãPerl 6ã«ã¯ããªããžã§ã¯ããèšè¿°ããããã®åŒ·åãªæ§æã ãã§ãªãããŸã æ³å®ããŠããªãå Žåã«æ¡åŒµããæ©èœããããŸããã¢ãžã¥ãŒã«ãšãšã¯ã¹ããŒã
Perl 6ã§ã©ã€ãã©ãªãäœæããã«ã¯ãmoduleããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãã module Fancy::Utilities { sub lolgreet($who) { say "O HAI " ~ uc $who; } }
ããã$ PERL6LIBã®ã©ããã«ããFancy / Utilities.pmãã¡ã€ã«ã«é
眮ãããšã次ã®ããã«äœ¿çšã§ããŸãã use Fancy::Utilities; Fancy::Utilities::lolgreet('Tene');
ç¹ã«äŸ¿å©ã§ã¯ãããŸãããPerl 5ã®ããã«ããã®ã¢ãžã¥ãŒã«ãããŒãããã³ãŒãã®ç¯å²å
ã§ããã€ãã®ãã®ãå©çšå¯èœã§ããã¹ãã§ããããšã瀺ãããšãå¯èœã§ããããã«ã¯æ§æããããŸãã
ããŒã¯ããããis exportãæåã¯ããã©ã«ãã§ãšã¯ã¹ããŒããããŸããæåã¯ååä»ãã°ã«ãŒãã®äžéšãšããŠãšã¯ã¹ããŒããããããšã«ã泚æã§ããŸãã module Fancy::Utilities { sub lolgreet($who) is export(:lolcat, :greet) { say "O HAI " ~ uc $who; } sub nicegreet($who) is export(:greet, :DEFAULT) { say "Good morning, $who!";
ãããã®ã¿ã°ãããŒãã³ãŒãã§äœ¿çšããŠãã€ã³ããŒããããã®ãéžæã§ããŸãã use Fancy::Utilities;
ãã«ãããã·ãŒãžã£ã¯ããã©ã«ãã§ãšã¯ã¹ããŒããããå¿
èŠã«å¿ããŠã©ãã«ã®ã¿ãæå®ã§ããŸãã multi sub greet(Str $who) { say "Good morning, $who!" } multi sub greet() { say "Hi!" } multi sub greet(Lolcat $who) { say "O HAI " ~ $who.name }
ã¯ã©ã¹ã¯ã¢ãžã¥ãŒã«ã®ç¹æ®åã§ãããããã¯ã©ã¹ããäœãããšã¯ã¹ããŒãããããšãã§ããŸãããŸããã¡ãœããããšã¯ã¹ããŒãããŠããã«ãããã·ãŒãžã£ãšããŠäœ¿çšã§ããŸããããšãã°ã次ã®ã³ãŒãã¯IOã¯ã©ã¹ããcloseã¡ãœããããšã¯ã¹ããŒããããcloseïŒ$ fhïŒ;ããšããŠåŒã³åºãããšãã§ããããã«ããŸã class IO { ... method close() is export { ... } ... }
Perl 6ã¯ãååã«ããã©ã€ãã©ãªããã®æåã®ã€ã³ããŒãããµããŒãããŠããŸãããžã£ã³ã¯ã·ã§ã³
Perl 6ã®æ°æ©èœã®äžã§ããç§ã¯äœãããé¢é£ã奜ãã§ããç§ã¯ãããã®äœ¿çšã®ããã®ãã¹ãŠã®ãªãã·ã§ã³ã衚æããŠããŸããããããã€ãã®äŸ¿å©ãªããªãã¯ãç¥ã£ãŠããŸãããŠããªã³ã¯ãäžåºŠã«è€æ°ã®å€ãå«ãããšãã§ãã倿°ã§ããå¥åŠã«èãããŸãããäŸãèŠãŠã¿ãŸããããå€ãªãã·ã§ã³ã®ããããã«æºæ ããŠãããã©ãã倿°ã確èªããå¿
èŠããããšããŸãã if $var == 3 || $var == 5 || $var == 7 { ... }
ãã®ã§ããããæ±ºããŠæããŸããã§ãããç¹°ãè¿ããå€ãããŸãããŠããªã³anyã䜿çšãããšã次ã®ããã«èšè¿°ã§ããŸãã if $var == any(3, 5, 7) { ... }
ãã®èšèªã®äžæ žã«ããã®ã¯ããã¢ãœã·ãšãŒã·ã§ã³ã®ã¹ã¬ãããžã®èªååå²ãïŒæ¥ååèªåã¹ã¬ããåïŒã®æŠå¿µã§ããããã¯ãã»ãšãã©åžžã«ã1ã€ã®å€ã®ã¿ãæåŸ
ãããå Žæã«ãŠããªã³ãæž¡ãããšãã§ããããšãæå³ããŸããã³ãŒãã¯é¢é£ä»ãã®ãã¹ãŠã®ã¡ã³ããŒã«å¯ŸããŠå®è¡ãããçµæã¯ååŸããããã¹ãŠã®çµæã®çµã¿åããã«ãªããŸããæåŸã®äŸã§ã¯ã==ãåãŠããªã³èŠçŽ ã«å¯ŸããŠå®è¡ããã$ varãšæ¯èŒãããŸãã忝èŒã®çµæã¯ãæ°ããå
±çšäœanyã«æžã蟌ãŸããifã¹ããŒãã¡ã³ãã®ããŒã«ã³ã³ããã¹ãã§è©äŸ¡ãããŸããããŒã«ã³ã³ããã¹ãã§ã¯ããã®ã¡ã³ããŒã®ãããããtrueã®å ŽåããŠããªã³anyã¯trueã§ããããã$ varããŠããªã³å€ã®ããããã«äžèŽããå Žåããã¹ãã¯ãã¹ããŸããããã«ããã³ãŒããç¯çŽã§ããããªããããã«èŠããŸããanyãŠããªã³ãèšè¿°ããå¥ã®æ¹æ³ããããããã¯|æŒç®åã䜿çšããŠæ§ç¯ã§ããŸãã if $var == 3|5|7 { ... }
å¿
èŠã«å¿ããŠãnoneãšãããŠããªã³ãªãã·ã§ã³ã䜿çšããŠãã¹ãçµæãå転ããŸãã if $var == none(3, 5, 7) { ... }
ãæ³åã®ãšãããããŒã«ã³ã³ããã¹ãã®ã©ããtrueã§ããã®ã¯ããã®èŠçŽ ãã©ããtrueã§ãªãå Žåã®ã¿ã§ããèªåã¹ã¬ããåã¯ãä»ã®å Žåã«ãæ©èœããŸãã my $j = any(1, 2, 3); my $k = $j + 2;
ã©ããªãã®ïŒæåã®äŸãšåæ§ã«ã$ kã®å€ã¯anyïŒ3ã4ã5ïŒã«ãªããŸããé¢é£ä»ãã¯ã¹ããŒãæ€çŽ¢ã§ãæ©èœããŸããããã«é©ããç¹å¥ãªçš®é¡ã®é¢é£ä»ãããããŸããããã¹ãæååããããã»ããã®ãã¹ãŠã®æ£èŠè¡šçŸãšäžèŽãããã©ããã調ã¹ãå¿
èŠããããšããŸãã $string ~~ /<first>/ & /<second>/ & /<third>/
ãã¡ãããæåã2çªç®ã3çªç®ã®èŠåæ§ãå®çŸ©ããå¿
èŠããããŸãã|ãïŒã®ããã«ããŠããªã³ãäœæããæŒç®åã§ããããã®å Žåããã¹ãŠã®ã¡ã³ããŒãtrueã§ããã°ããã¹ãŠã®ãŠããªã³ãtrueã«ãªããŸããã¢ãœã·ãšãŒã·ã§ã³ã®å©ç¹ã¯ãã©ã€ãã©ãªã®ã»ãšãã©ãã¹ãŠã®é¢æ°ã«è»¢éã§ããããšã§ãããã®é¢æ°ã¯ãããããã¢ãœã·ãšãŒã·ã§ã³ã§ããããšãç¥ãå¿
èŠã¯ãããŸããïŒãã ããããããèªèããŠç¹å¥ãªæ¹æ³ã§æäœããããšã¯å¯èœã§ãïŒãå€ãšäœãã®ã¹ããŒããªæ¯èŒãè¡ã颿°ãããå Žåããããå
±çšäœãšããŠæž¡ãããšãã§ããŸããé¢é£ã®å©ããåããŠã¯ã©ã³ã¯ã¢ãŠãã§ãã䟿å©ãªãã®ããããŸãããªã¹ãå
ã®å€ã¯æ¬¡ã®ãšããã§ãã any(@list) == $value
ãªã¹ãã¯é¢é£ä»ããç°¡åãã€èªç¶ã«æ©èœããŸããäŸïŒ all(@list) > 0;
åççãªåæ°
Perl 6ã¯åççãªåæ°ããµããŒãããŸããããã¯åçŽãªæ¹æ³ã§äœæãããŸã-1ã€ã®å
šäœãå¥ã®éšåã«åå²ããããšã«ãã£ãŠãæåã¯ãããã§ç°åžžãªãã®ãèŠåããã®ã¯å°é£ã§ãã > say (3/7).WHAT Rat() > say 3/7 0.428571428571429
Ratãæååã«å€æããã«ã¯ãæ°å€ãå°æ°ç¹ä»ãã®ã¬ã³ãŒããšããŠè¡šç€ºããŸããããããRatã¯ãNumã®ãããªæµ®åå°æ°ç¹æ°ã§æºããããŠããè¿äŒŒè¡šçŸã§ã¯ãªããæ£ç¢ºãªå
éšè¡šçŸã䜿çšããŸãã > say (3/7).Num + (2/7).Num + (2/7).Num - 1; -1.11022302462516e-16 > say 3/7 + 2/7 + 2/7 - 1 0
Ratçªå·ã®å
éšã§äœãèµ·ããããç¥ãæãç°¡åãªæ¹æ³ã¯ãçµã¿èŸŒã¿ã®.perlã¡ãœããã䜿çšããããšã§ãã人éãèªããæååãè¿ããŸãããã®æååã¯ãevalãéããŠå
ã®ãªããžã§ã¯ãã«å€ãããŸãã > say (3/7).perl 3/7
Ratã³ã³ããŒãã³ããéžæã§ããŸãïŒ > say (3/7).numerator 3 > say (3/7).denominator 7 > say (3/7).nude.perl [3, 7]
ã©ããã¯ããã¹ãŠã®æšæºçãªæ°å€æŒç®ã§åäœããŸããå¯èœã§ããã°ãåºåã§Ratã䜿çšããç®è¡æŒç®ãRatãæäŸããäžå¯èœãªå Žåã¯NumãæäŸããŸãã > my $a = 1/60000 + 1/60000; say $a.WHAT; say $a; say $a.perl Rat() 3.33333333333333e-05 1/30000 > my $a = 1/60000 + 1/60001; say $a.WHAT; say $a; say $a.perl Num() 3.33330555601851e-05 3.33330555601851e-05 > my $a = cos(1/60000); say $a.WHAT; say $a; say $a.perl Num() 0.999999999861111 0.999999999861111
Numã«ã¯ãäžããããè¿äŒŒïŒããã©ã«ãã§ã¯1e-6ïŒã®Ratãäžãããã¡ãã·ã§ããã«ãªæ¹æ³ããããŸãã > say 3.14.Rat.perl 157/50 > say pi.Rat.perl 355/113 > say pi.Rat(1e-10).perl 312689/99532
仿§ã«ããã°ããœãŒã¹ã³ãŒãã«10鲿°ãšããŠèšè¿°ãããæ°å€ã¯ãRatãšããŠè¡šãããŸãã > say 1.75.WHAT Rat() > say 1.75.perl 7/4 > say 1.752.perl 219/125
.pick
ãã1ã€ã®Perl 6ã®é©æ°ã¯ã.pickã¡ãœããã§ããããã«ãããã©ã³ãã ãªã¹ãã¢ã€ãã ãéžæã§ããŸããPerl 5ã§ã¯ãããã¯æ¬¡ã®ããã«å®è¡ã§ããŸãã my @dice = (1, 2, 3, 4, 5, 6); my $index = int (rand() * scalar @dice); print $dice[$index] . "\n"; > 5
Perl 6ã§ã¯ããã«ã·ã³ãã«ã«ãªããããã«ããã€ãã®èŠçŽ ãããã«éžæã§ããŸãã my @dice = 1..6; say @dice.pick(2).join(" "); > 3 4
ããŠã10åã®d6ãæãããšã©ã®ãããªæ»æãåããã®ãèŠãŠã¿ãŸããã... my @dice = 1..6; say @dice.pick(10).join(" "); > 5 3 1 4 2 6
.pickã¯ãã®ååãšäžèŽããããšãããããŸããããªã¹ãããäœããåé€ãããšããªã¹ãã«ã¯è¡šç€ºãããªããªããŸãããã®ã¢ã€ãã ãååºŠéžæã§ããããã«ããå¿
èŠãããå Žåã¯ããreplaceããšããåèªã䜿çšããŸã my @dice = 1..6; say @dice.pick(10, :replace).join(" "); > 4 1 5 6 4 3 3 5 1 1
ãªã¹ãã«ã¯ãç¹å®ã®é åºã§ã¢ã€ãã ãå«ããå¿
èŠã¯ãããŸããããã¢ãããªãŒãã®æ³æ¡ã¯æ¬¡ã®ãšããã§ãã my @dice = <1 5 10 20 50 100 500>; say @dice.pick(10, :replace).join(" "); > 20 50 100 500 500 10 20 5 50 20
ãããŠãããã«ã«ãŒãã®ãããã®ãªãã·ã§ã³ããããŸãïŒ use v6; class Card { has $.rank; has $.suit; multi method Str() { return $.rank ~ $.suit; } } my @deck; for <A 2 3 4 5 6 7 8 9 TJQ K> -> $rank { for < > -> $suit { @deck.push(Card.new(:$rank, :$suit)); } }
pickïŒ*ïŒã¯äœãããŸããïŒå°ãåŸã§æ€èšããŸãããšãããããã«ãŒããããã®ã³ãŒããæ¹åããŠãããã¯ã©ã¹ãäœæããæ¹æ³ãèããŠãã ãããå€ãè¯ãã¹ã€ãã
ã³ã³ã¹ãã©ã¯ãã¯ãswitchã¹ããŒãã¡ã³ãããšåŒã°ããŸãããããŒã¯ãŒãã¯æå®ããããã®ã«å€æŽãããŸãã given $weather { when 'sunny' { say '! ' } when 'cloudy' { say ' . ' } when 'rainy' { say ' ? ' } when 'snowy' { say '! ' } default { say ' , .' } }
ãããã¯ãèªåçã«åŠçããããšããã¹ãŠã§ã¯ãªãããšã«æ³šæããŠãã ãã-çªç¶ããã€ãã®æ¡ä»¶ãåæã«æºãããããšãæåã®é©åãªãããã¯ã®ã¿ãå®è¡ãããŸãã given $probability { when 1.00 { say '' } when * > 0.75 { say ' ' } when * > 0.50 { say '' } when * > 0.25 { say '' } when * > 0.00 { say ' ' } when 0.00 { say ' ' } }
$確çã0.80ã«çããå Žåãã³ãŒãã¯ãæãå¯èœæ§ãé«ããã瀺ããæ®ãã®ãªãã·ã§ã³ã¯ããã§ã¯ãããŸãããè€æ°ã®ãããã¯ãæ©èœãããå Žåã¯ãåèªcontinueã§ãããã¯ãçµäºããŸãïŒãããã¯ãå¶åŸ¡ããbreak / continueããŒã¯ãŒãã¯ãæå/ç¶è¡ããããã«ååã倿ŽãããŸãïŒãåŒãã³ãŒãã§æååãšæ°å€ã®äž¡æ¹ã䜿çšããå Žåã«æ³šæããŠãã ãããPerl 6ã¯ãäžããããå€ãããããã®ç©ãå®å
šã«ç°ãªãã¿ã€ãã«ãªãå¯èœæ§ããããšãã«ãããã³ã°ããæ¹æ³ãã©ã®ããã«ç¥ã£ãŠããŸããïŒãã®å Žåããããã2ã€ã®å€ãåŠçãããŸããåè¿°ã®ã¹ããŒããªæ¯èŒã $ a ~~ $ bãšããŠæžãããã¹ããŒããªæ¯èŒã¯ãæ£èŠã®ããªãããŒãªããŒãžã§ã³ã§ããã®ã£ãããæå®ãããŠããå Žåãã¹ããŒãæ¯èŒã¯å€ãããã«å«ãŸãããã©ããã確èªããŸãã $ bãã¯ã©ã¹ãããŒã«ããŸãã¯ãµãã¿ã€ãã®å Žåãã¹ããŒãæ¯èŒã¯ã¿ã€ããæ¯èŒããŸãããªã©ãªã©ãã¿ã€ãNumããã³Strã®å€ã®å Žåããããã®ç䟡æ§ããã§ãã¯ãããŸããã¢ã¹ã¿ãªã¹ã¯ã¯ããããããã®ãšã¹ããŒãã«æ¯èŒããŸãããããŠãããã©ã«ãã¯when *ãšåãæå³ã§ãããããŠãããã«ããªãã«ãšã£ãŠäºæããªããã®ããããŸãïŒäžãããããã€ç¬ç«ããŠäœ¿çšã§ããããããªããããªãã®ãã·ãŒã«ãããšèšããªããããããã©ã®ããã§ãããã説æããŸãïŒäžããããã®ã¯äžåºŠéãã®ãµã€ã¯ã«ã§ãã given $punch-card { .bend; .fold; .mutilate; }
ããã§äžããããã®ã¯ãåã«ãããã¯ãèšå®ãããã®ã§ã$ _ãšããŠç¥ãããŠããŸãã.methodã¡ãœããã®åŒã³åºãã¯ã$ _ã®åŒã³åºããšåçã§ãã$ _ãæç€ºçã«ãŸãã¯æé»çã«æå®ãããããã¯å
ã§äœ¿çšã§ããã¡ãœããwhenïŒ my $scanning; for $*IN.lines { when /start/ { $scanning = True } when /stop/ { $scanning = False } if $scanning {
æå®ããããããã¯ãšåãåäœã瀺ããšããã€ãŸã å®è¡åŸã«ãããã¯ã«æ®ã£ãŠããã³ãŒããã¹ãããããŸããäžèšã®äŸã§ã¯ãããã¯æ¬¡ã®è¡ã«é²ãããšãæå³ããŸãã$ _ãæç€ºçã«æå®ããå¥ã®äŸïŒ sub fib(Int $_) { when * < 2 { 1 } default { fib($_ - 1) + fib($_ - 2) } }
äžããããç¬ç«æ§ãšææã¯ãä»ã®ç¶æ³ã§äœ¿çšã§ããŸããCATCHãããã¯ãåŠçãããšããäžãããããšãããã£ãããããæåŸã®äŸå€ãå«ã$ïŒå€æ°ã§åäœããŸããåŒãæŒç®åã§çµããå Žåã«å€æŽãããã¬ã³ãŒãã·ãŒã±ã³ã¹ã®ãªãã·ã§ã³ïŒ say .[0] + .[1] + .[2] given @list; say ' , !' when /^ <[]>+ $/;
ã«åã蟌ãããšãã§ããå ŽåïŒ say '!' when // given $castle;
äžãããããšããšã³ãŒããéåžžã«æç¢ºã«ãããšããããã«å¥ã®perlã¹ã¿ã€ã«ã®é£èªåããããŸã $ perl6 -e 'for ^20 {my ($a,$b)=<AT CG>.pick.comb.pick(*);\ my ($c,$d)=sort map {6+4*sin($_/2)},$_,$_+4;\ printf "%{$c}s%{$d-$c}s\n",$a,$b}' GC TA CG GC CG GC TA CG CG CG TA TA TA CG TA TA TA AT CG GC
éªã ããŸãäœã
Mandelbrotã»ãããäŸãšããŠäœ¿çšããŠãPerl 6ã§è€çŽ æ°ãåŠçããæ¹æ³ã説æããŸããããã«ã¯ãé«åºŠãªæ°åŠãçŸããåçãããããçš®é¡ã®é«åºŠãªèšèªæ©èœããããŸããã¹ã¯ãªããã®æåã®ããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã use v6; my $height = @*ARGS[0] // 31; my $width = $height; my $max_iterations = 50; my $upper-right = -2 + (5/4)i; my $lower-left = 1/2 - (5/4)i; sub mandel(Complex $c) { my $z = 0i; for ^$max_iterations { $z = $z * $z + $c; return 1 if ($z.abs > 2); } return 0; } sub subdivide($low, $high, $count) { (^$count).map({ $low + ($_ / ($count - 1)) * ($high - $low) }); } say "P1"; say "$width $height"; for subdivide($upper-right.re, $lower-left.re, $height) -> $re { my @line = subdivide($re + ($upper-right.im)i, $re + 0i, ($width + 1) / 2).map({ mandel($_) }); my $middle = @line.pop; (@line, $middle, @line.reverse).join(' ').say; }
è¡3ã5ã¯ãã°ã©ãã®ãã¯ã»ã«ã®ãµã€ãºãæå®ããŸãã@ * ARGS-ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãå«ãé
åã®ååã//æŒç®åã¯æ°ãããå®çŸ©æžã¿ãã§ãå®çŸ©ãããŠããå Žåã¯æåã®åŒæ°ãè¿ããå®çŸ©ãããŠããå Žåã¯2çªç®ã®åŒæ°ãè¿ããŸããèšãæãããšã3è¡ç®ã¯ãã³ãã³ãã©ã€ã³ã®æåã®åŒæ°ã®å€ã«é«ããèšå®ããããã§ãªãå Žåã¯31ã«èšå®ããŸããå¹
ã¯é«ãã«çããèšå®ãããŸãã$ max_iterationsã¯ãã¡ã€ã³ã«ãŒãã®ç¹°ãè¿ãåæ°ãèšå®ããŸãããã®åŸããã€ã³ããã»ããã«å±ãããšå€æãããŸãïŒå¯Ÿç§°åœ¢ç¶ã§äœæ¥ãããããå¹
ã¯å¥æ°ã«ããå¿
èŠããããŸãïŒè¡7ã8ã¯ãè€çŽ å¹³é¢äžã®ç»åã®å¢çãæå®ããŸããèæ°ã³ã³ããŒãã³ããæ°å€ã«è¿œå ããã®ã¯éåžžã«ç°¡åã§ãæ°å€ãŸãã¯åŒiã«è¿œå ããã ãã§ããããã¯å€ãã®ã¿ã€ãã®è€åäœã§ããããšã倿ããŸãããããšãã°ãRatãŸãã¯Intã«Complexã远å ãããšãåã³ComplexãååŸãããŸããè¡10ã17ã¯ããã³ãã«ããã®äž»ãªæ©èœãå®çŸ©ããŠããŸããã€ãŸããå埩ãç¶ããå Žåãæ¹çšåŒz = z * z + cïŒåæzã¯0ïŒãæçã®ãŸãŸã§ããã°ãè€çŽ æ°cã¯ã»ããã«å«ãŸããŸãããã®ããã颿°ãèšè¿°ãããŠããŸã-$ max_iterationsåå®è¡ããã«ãŒããå®çŸ©ããŸããã¢ãžã¥ãŒã«zã2ãã倧ãããªããšãå¢çãç¶æãããªãããšãããã£ãŠããããããã§ãã¯$ z.abs> 2ã䜿çšããŸãããããçºçããå Žåãã«ãŒããçµäºãããã€ã³ããé»ã§ããããšã瀺ã1ãè¿ããŸããã«ãŒããæå€§åæ°ãè¶
ããŠãå€ãè¶
ããªãå Žåã0ãè¿ãããã€ã³ãã¯çœã«ãªããŸãã19è¡ç®ãã21è¡ç®ã¯ãèŠçŽ æ°ãcountã§ãã$ lowãã$ highãžã®ç®è¡çé²è¡ãè¿ãè£å©é¢æ°ã§ããã¿ã€ã$ lowããã³$ highã¯æå®ãããŠããªããããåºæ¬çãªç®è¡æŒç®ãèš±å¯ãããã¹ãŠã®ã¿ã€ããããã§æ©èœããŸãããã®ã¹ã¯ãªããã§ã¯ãããã¯æåã«Numãæ¬¡ã«Complexã§ããè¡23ã24ã¯ãPBMãã¡ã€ã«ã®ããããŒãæå®ããŸãã26ã30è¡ç®ã¯çµµãæããŸãã $ upper-right.reã¯è€çŽ æ°$ã®å®æ°éšã§ããã$ upper-right.imã¯èæ°ã§ãããµã€ã¯ã«ã¯ã®ã£ããã®å®éã®éšåãééããŸããã«ãŒãã§ã¯ãèæ°éšã®ãµãã»ãããå床䜿çšããŠãç»åã®ãã®è¡ã®ååããã§ãã¯ããå¿
èŠãããè€éãªå€ã®ãªã¹ããäœæããŸããæ¬¡ã«ããã®ãªã¹ãã¯mapã䜿çšããŠãã³ãã«é¢æ°ãä»ããŠå®è¡ãããåºåã¯äžç¹ãå«ãååã®ã·ãªãŒãºã®ãŒããš1ã®ãªã¹ãã§ããããã¯ããã³ãã«ããéåã軞ã«é¢ããŠå¯Ÿç§°ã§ããããã§ãããããã£ãŠãæåŸã®äžéç¹ãéžæãããªã¹ããå±éããŠãåããªã¹ãã«ãªããéæ¹åã«ã®ã¿ïŒäžéç¹ãé€ãïŒã«ãªãããã«ããŸããããŒã³ããããçµåã«æž¡ããè¡ãæåŸãŸã§åããŠå°å·ããŸãããã®ãããªæäœã«ãããéåžžã®äœçœ®ãã90床å転ããã»ãããçæãããããããã®çš®ã®çŸããéªã ããŸãåŸãã
ãŸãããã®ã¢ã«ãŽãªãºã ã¯ããã€ããŒæŒç®åãä»ããŠèªåçã«äžŠååã§ããŸããã1ã€ã®åé¡ããããŸãïŒãã€ããŒæŒç®åã¯éåžžã®æé ãåŒã³åºãããšãã§ããŸãããã¯ã©ã¹ã®ã¡ãœãããšæŒç®åã®ã¿ãåŒã³åºããŸãããããã£ãŠãComplexã¯ã©ã¹ã調æŽããŠã.mandelã¡ãœãããå«ãŸããããã«ããŸãã augment class Complex { method mandel() { my $z = 0i; for ^$max_iterations { $z = $z * $z + self; return 1 if ($z.abs > 2); } return 0; } } for subdivide($upper-right.re, $lower-left.re, $height) -> $re { my @line = subdivide($re + ($upper-right.im)i, $re + 0i, ($width + 1) / 2)>>.mandel; my $middle = @line.pop; (@line, $middle, @line.reverse).join(' ').say; }
éãã¯ããã³ãã«ãã¡ãœããã«ãªããèªå·±ã$ cåŒæ°ã®åœ¹å²ãæãããããšã§ãããããŠããããïŒ{mandelïŒ$ _ïŒ}ïŒã®ä»£ããã«ããã€ããŒæŒç®åã䜿çšããŸãããããã誰ããComplexã¯ã©ã¹ã倿Žããããªãå Žåã¯ããã³ãã«ãæŒç®åã«å€ããããšãã§ããŸãã sub postfix:<>(Complex $c) { my $z = 0i; for ^$max_iterations { $z = $z * $z + $c; return 1 if ($z.abs > 2); } return 0; } for subdivide($upper-right.re, $lower-left.re, $height) -> $re { my @line = subdivide($re + ($upper-right.im)i, $re + 0i, ($width + 1) / 2)>>; my $middle = @line.pop; (@line, $middle, @line.reverse).join(' ').say; }
Perl 6ã¯UnicodeããµããŒãããŠããã®ã§ã楜ãã¿ãæã£ãŠãéªã ããŸãã£ã©ã¯ã¿ãŒãä»ããŠãªãã¬ãŒã¿ãŒãèšå®ã§ããŸããæ¥œå ã®ææ°ããŒãžã§ã³ã§ã¯ãã¹ã¯ãªãããåç·šéããŠãã«ã©ãã«ãªç»åãäœæããŸãããããã¯é
ããå€ãã®ã¡ã¢ãªãæ¶è²»ããŸãããå®å®ããŠåäœããŸãã1001Ã1001ã®è§£å床ã®MandelbrotããããããããŸããããã¯14æé誀ç®ããã6.4 GBã®ã¡ã¢ãªãå¿
èŠãšããŸããã
圹å²
OOPã®äŒçµ±ã«ããã°ãã¯ã©ã¹ã¯ã€ã³ã¹ã¿ã³ã¹ã®ç®¡çãšåå©çšãæ±ããŸããæ®å¿µãªãããããã¯éã®çµæã«ã€ãªãããŸããåå©çšã¯ã¯ã©ã¹ãå°ããæå°éã«ããåŸåããããŸãããè€éãªãšã³ãã£ãã£ã衚ãå Žåã¯ãããã«å¿
èŠãªãã¹ãŠããµããŒãããå¿
èŠããããŸããPerl 6ã§ã¯ãã¯ã©ã¹ã¯ã€ã³ã¹ã¿ã³ã¹ã®å¶åŸ¡ãä¿æããããŒã«ã¯åå©çšããŸããããŒã«ãšã¯äœã§ããïŒãããããç°ãªãã¿ã€ãã®è£œåã衚ãã¯ã©ã¹ã®æãæ§ç¯ããŠãããšæ³åããŠãã ãããäžéšã«ã¯å
±éã®æ©èœãšå±æ§ããããŸããããšãã°ãBatteryPowerã®åœ¹å²ãããå ŽåããããŸãã role BatteryPower { has $.battery-type; has $.batteries-included; method find-power-accessories() { return ProductSearch::find($.battery-type); } }
äžèŠã屿§ãšã¡ãœããã®ã¯ã©ã¹ã®ããã«èŠããŸãããã ããããŒã«ãèªåã§äœ¿çšããããšã¯ã§ããŸããã代ããã«ãdoesããŒã¯ãŒãã䜿çšããŠã¯ã©ã¹ã«æ¿å
¥ïŒæ§æïŒããŸãã class ElectricCar does BatteryPower { has $.manufacturer; has $.model; }
æ§æã¯ãããŒã«ãã屿§ãšã¡ãœãããååŸããããããã¯ã©ã¹ã«ã³ããŒããŸãããã以éããã¹ãŠãã¯ã©ã¹èªäœã§å±æ§ãšã¡ãœãããå®çŸ©ãããŠãããã®ããã«æ©èœããŸããã¡ãœãããé
åžããããšãã«èŠªã¯ã©ã¹ãæ€çŽ¢ãããç¶æ¿ãšã¯ç°ãªããã¯ã©ã¹ã¯ç¹å®ã®åœ¹å²ãæãããŠãããã©ããã®è³ªåã«å¿ããŠyesãšèšãããšãé€ããŠãããã°ã©ã ã®å®è¡æã«æ¥ç¶ãæã¡ãŸãããèå³ã¯ãã¯ã©ã¹ã«ããã€ãã®ããŒã«ãæ¿å
¥ããããšããå§ãŸããŸããSocketPowerãšããå¥ã®åœ¹å²ããããšããŸãã role SocketPower { has $.adapter-type; has $.min-voltage; has $.max-voltage; method find-power-accessories() { return ProductSearch::find($.adapter-type); } }
ã©ãããããã¯ã³ã³ã»ã³ããŸãã¯ããããªãŒã§å®è¡ã§ãããããäž¡æ¹ã®åœ¹å²ãæ¿å
¥ããŸãã class Laptop does BatteryPower does SocketPower { }
ã³ã³ãã€ã«ã詊ã¿ãŸãããäœãæ©èœããŸãããããã¯ã¹ã€ã³ãç¶æ¿ãšã¯ç°ãªãããã¹ãŠã®åœ¹å²ã¯åãäœçœ®ã«ãããŸããäž¡æ¹ã®åœ¹å²ãåãååã®ã¡ãœããïŒãã®å Žåã¯find-power-accessoriesïŒãæäŸããå Žåãç«¶åãçºçããŸããããã¯ãå®è¡ããå¿
èŠãããããšã決å®ããã¡ãœãããã¯ã©ã¹ã«æäŸããããšã§è§£æ±ºã§ããŸãã class Laptop does BatteryPower does SocketPower { method find-power-accessories() { my $ss = $.adapter-type ~ ' OR ' ~ $.battery-type; return ProductSearch::find($ss); } }
ããã¯æãäžè¬çãªåœ¹å²ã®äœ¿çšäŸã§ãããå¯äžã®äŸã§ã¯ãããŸãããããŒã«ã¯åãå
¥ããããdosããã³butã¹ããŒãã¡ã³ããä»ããŠãªããžã§ã¯ãã«ïŒã€ãŸããã¯ã©ã¹ã¬ãã«ã§ããã ããªããžã§ã¯ãã¬ãã«ã§ïŒæ¿å
¥ã§ããŸããããã¯ãJavaããã³CïŒã®ã€ã³ã¿ãŒãã§ãŒã¹ãšåæ§ã«æ©èœããŸããããããä»ã¯ããã«ã€ããŠè©±ããŸããããPerl6ã®ããŒã«ãäžè¬åãããããã°ã©ãã³ã°ããŸãã¯ãã©ã¡ããªãã¯å€çžæ§ãã©ã®ããã«æ±ããããããã瀺ããŸããããŒã«ã¯ãã©ã¡ãŒã¿ãŒãåãåãããšãã§ããŸãããã©ã¡ãŒã¿ãŒã¯ã¿ã€ããŸãã¯å€ã§ããããšãã°ãéæãèšç®ããå¿
èŠããã補åã«å²ãåœãŠã圹å²ãäœæã§ããŸãããã ããé
éè²»çšãèšç®ããããã®ä»ã®ã¢ãã«ãæäŸã§ããå¿
èŠããããããé
éè²»çšãããŒã«ã®ãã©ã¡ãŒã¿ãŒãšããŠåŠçã§ããã¯ã©ã¹ã䜿çšããŸãã role DeliveryCalculation[::Calculator] { has $.mass; has $.dimensions; method calculate($destination) { my $calc = Calculator.new( :$!mass, :$!dimensions ); return $calc.delivery-to($destination); } }
ãã::ããŒã«åã®åŸã®è§ãã£ãå
ã®é»åã¯ããªããžã§ã¯ãããã£ããã£ããããŒã«å
ã®é»ååãšé¢é£ä»ããããšã瀺ããŸããæ¬¡ã«ããã®ãªããžã§ã¯ãã䜿çšããŠ.newãåŒã³åºãããšãã§ããŸãã ByDimensionãšByMassã®éæãèšç®ããã¯ã©ã¹ãäœæãããšããŸããæ¬¡ã«ã次ã®ããã«èšè¿°ã§ããŸãã class Furniture does DeliveryCalculation[ByDimension] { } class HeavyWater does DeliveryCalculation[ByMass] { }
ãã©ã¡ãŒã¿ãŒã䜿çšããŠããŒã«ãå®çŸ©ããå Žåã¯ãåã«è§ãã£ãã§ãã©ã¡ãŒã¿ãŒã®ã»ãããæå®ããããŒã«ã䜿çšããå Žåã¯ãåŒæ°ã®ãªã¹ããè§ãã£ãã§å²ã¿ãŸãããããã£ãŠããã®å ŽåãPerl 6ãã©ã¡ãŒã¿ãŒã»ããã®å
šæ©èœã䜿çšã§ããŸãããŸããããã©ã«ãã®ããŒã«ã¯è€æ°ãè€æ°ã§ãããããåãååã®å€æ°ã®ããŒã«ãæå®ã§ããŸãããããã®ããŒã«ã¯ãç°ãªãã¿ã€ããšç°ãªãã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãåããŸããè§æ¬åŒ§ã䜿çšããŠããŒã«ããã©ã¡ãŒã¿ãŒåããæ©èœã«å ããŠãåããŒã«ããã©ã¡ãŒã¿ãŒã1ã€ã ãåãå
¥ããå Žåã¯ãofããŒã¯ãŒãã䜿çšããããšãã§ããŸãããããã£ãŠã次ã®å®£èšã®åŸïŒ role Cup[::Contents] { } role Glass[::Contents] { } class EggNog { } class MulledWine { }
ãã®ããã«æžãããšãã§ããŸãïŒ my Cup of EggNog $mug = get_eggnog(); my Glass of MulledWine $glass = get_wine();
次ã®ããã«èŠçŽããããšãã§ããŸãã role Tray[::ItemType] { } my Tray of Glass of MulledWine $valuable;
æåŸã®äŸã¯ãTray [Glass [MulledWine]]ã®ããèªã¿ããããšã³ããªã§ããAnything Anythingã¯ãç¹å®ã®ã³ã³ããã¹ãã§æå³ã®ãããã¹ãŠã衚ãPerl 6ã®åã§ããäŸïŒ
1..*
ããã§ã¯ããã®éæ³ã¯ã©ã®ããã«æ©èœããŸããïŒããã€ãã®äŸã¯åçŽã§ãã*åŒã®ã¡ã³ããŒã®äœçœ®ã§ãWhateverãªããžã§ã¯ããè¿ãããäžéšã®çµã¿èŸŒã¿é¢æ°ïŒããšãã°ãList.pickïŒã¯ãããã©ãåŠçããããç¥ã£ãŠããŸãããšããã§ãPerl 6ã¯ãã¡ã€ã«ãäºæž¬çã«è§£æããŸããã€ãŸããã³ã³ãã€ã©ãŒãã³ãŒããèªã¿åããšãåŒã®ã¡ã³ããŒãŸãã¯æŒç®åã®ãããã«äŒã£ãããåžžã«èªèããŸãã say 2 + 4 | | | | | | | + () | | + ( +) | + () + (listop),
ãããã£ãŠãèšé²ã« * * 2
æåã®*ã¯åŒã®ã¡ã³ããŒãšããŠæ±ããã2çªç®ã¯æŒç®åãšããŠæ±ãããŸãããã®äŸã§ã¯ãã³ãŒããããã¯-> $ x {$ x * 2}ãçæããŸãã my $x = * * 2; say $x(4);
åãæ¹æ³ say @x.map: * ~ 'A';
ã®çããšã³ããªã§ã say @x.map: -> $x { $x ~ 'A' };
ã§ã
say @x.map: *.succ;
ã®çããšã³ã㪠say @x.map: -> $x { $x.succ };
äžŠã¹æ¿ãã«ã䟿å©ãªãã®ã¯äœã§ã-ããšãã°ãæ°åã®é åºã§ãªã¹ããäžŠã¹æ¿ããã«ã¯ïŒãã¬ãã£ãã¯ã¹+ã¯æ°å€ã«å€æããããšãæå³ããŸãïŒïŒ @list.sort: +*
æååã®èŠåã«åŸã£ãŠãªã¹ãããœãŒãããã«ã¯ïŒãã¬ãã£ãã¯ã¹ãã¯ãå€ãæåå圢åŒã«å€æããããšãæå³ããŸãïŒïŒ @list.sort: ~*
ã¡ãã£ãšããããªãã¯
Perl 6ã®ã·ã³ãã«ã§åŒ·åãªã¢ã€ãã¢ã®1ã€ã¯ãå
çã§ããYaPã®å Žåãããã¯èšèªèªäœã䜿çšããŠèšèªã«ã€ããŠè³ªåã§ããã¡ã«ããºã ã§ããããšãã°ããªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã«ã¯ãã©ã®ã¯ã©ã¹ã«å±ãããã瀺ãã¡ãœããã䜿çšå¯èœãªã¡ãœããããªã¹ãããã¡ãœãããªã©ããããŸããããã·ãŒãžã£ã«ãããã®ããã·ãŒãžã£ã®ååãå ±åããã¡ãœããããããŸãã sub foo (Int $i, @stuff, $blah = 5) { ... } say &foo.name;
ããã¯ããŸãæå³ããããŸããããããã·ãŒãžã£ãã¹ã«ã©ãŒã«å²ãåœãŠããããšã€ãªã¢ã¹ãä»äžãããããªã³ã¶ãã©ã€ã§äœæãããã§ãããããã³ãŒããèŠããšãã«ããã·ãŒãžã£åãå¿
ãããæç¢ºã§ã¯ãªãããšã«æ³šæããŠãã ããã my $bar = &foo;
æé ãåŠç¿ããããã®ããã€ãã®æ¹æ³ã次ã«ç€ºããŸãã say &foo.signature.perl;
æåŸã®ãã©ã¡ãŒã¿ãŒã¯ã¢ãªãã£ããŸãã¯å¿
é ãã©ã¡ãŒã¿ãŒã®æ°ã§ããPerl 6ã®ã€ã³ããã¹ãã¯ã·ã§ã³ã®ãããã§ã以åã¯äžå¯èœã ã£ãããšãã§ããŸããããšãã°ãPerl 5ã§ã¯ãmapãããã¯ã¯ãã€ã³ãã®ãªã¹ããäžåºŠã«1ã€ãã€ååŸããããã1ã€ä»¥äžã®æ°ãããã€ã³ãã«å€æããŠãããããæ°ãããªã¹ããäœæããŸããPerl 6ã¯äºæ³ãããåŒæ°ã®æ°ãç¥ã£ãŠããã®ã§ãå¿
èŠãªã ãå€ããåãããšãã§ããŸãã my @foo = map -> $x, $y { ... }, @bar;
å¥ã®å©ç¹ã¯ãæå忝èŒä»¥å€ã®åºæºã§é
åããœãŒãããããã®ãã䟿å©ãªã¡ã«ããºã ã§ããé
åã®äžŠã¹æ¿ãæé ãæå®ããå Žåãéåžžã¯2ã€ã®åŒæ°ãåããŸãâé
åããæ¯èŒããé
ç®ã§ããã«ã«ãã§äººã
ããœãŒããããå Žåãæ¬¡ã®ããã«æžããŸãã
ãããã
å
芳ã®ãããã§ãå¥ã®ãªãã·ã§ã³ããããŸãã1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ããšãããã·ãŒãžã£ãŒãæž¡ãããšã«ãããPerl 6ã¯ãã·ã¥ã¯ã«ã倿ã«çžåœãããã®ãèªåçã«äœæã§ããŸããen.wikipedia.org/wiki/Swartz Transformation .say for @people.sort: { $^a.karma };
ãã ãããã©ã¡ãŒã¿ã¯1ã€ãããªããããããã·ãŒãžã£å
ã§$ _ãæé»çã«èšå®ããããããäœåãªæåãåé€ã§ããŸãã .say for @people.sort: { .karma };
ãã®äŸã§ã¯ãé
åã®åèŠçŽ ã«å¯ŸããŠ.karmaã¡ãœããã1åïŒéåžžã®å Žåã®æ¯èŒã®ããã«2åã§ã¯ãªãïŒåŒã³åºãããããã®çµæã«åŸã£ãŠé
åãäžŠã¹æ¿ããŸããå¥ã®ããªãã¯ã¯ãçµã¿èŸŒã¿åã·ã¹ãã ã§ããäžèšã®äŸã§ã¯ãperlã¯æ°å€ã䜿çšããŠãããšæšæž¬ãããããæ°å€ã®äžŠã¹æ¿ãã®å¿
èŠæ§ã宣èšããŸããã§ããããœãŒãã®ã¿ã€ãã匷å¶ããå¿
èŠãããå Žåã+ãŸãã¯ãã䜿çšããŸãã .say for @people.sort: { +.karma };
.minããã³.maxã¡ãœããã§ã¯ãããã¯ç¹ã«äŸ¿å©ã§ãããŸãããœãŒãåºæºã決å®ããæé ãæ¡çšããŠããŸãã say @people.min: { +.karma }
ããã¯Whateverã䜿çšããŠæžãããšãã§ããŸãïŒ .say for @people.sort: *.karma; say @values.min: +*.karma; say @values.max: ~*.name;
ææ³ãšã¢ã¯ã·ã§ã³
è§£æããå¿
èŠã®ããããã¹ãããããããããšããŸããããPerlã¯ãããç®çãšããŠããŸããïŒåé¡ãç¹å®ããŸããæ¬¡ã®ããã¹ãã§è³ªåãšåçã説æããŸãã pickmany: ? ac: ac: ac: ai: pickone: ? ac: ai: ai: ai:
Perl 6ã§ã¯ãæ§æè§£æçšã®ææ³ãå®çŸ©ããŸããããã¯ãæ£èŠè¡šçŸãå«ãç¹å¥ãªçš®é¡ã®åå空éã§ãããŸããããã€ãã®ååä»ãåŒãå®çŸ©ããŠãè§£æã¿ã¹ã¯ãéšåã«åå²ããŸãã grammar Question::Grammar { token TOP { \n* <question>+ } token question { <header> <answer>+ } token header { ^^ $<type>=['pickone'|'pickmany'] ':' \s+ $<text>=[\N*] \n } token answer { ^^ \s+ $<correct>=['ac'|'ai'] ':' \s+ $<text>=[\N*] \n } }
ããã©ã«ãã§ã¯ãææ³ã§ã¯ç©ºçœã¯ç¡èŠãããè¡å
šäœã§äžèŽãæ€çŽ¢ãããŸã-修食å/ xããã³/ sãPerl 5ã«å«ãŸããŠãããã®ããã«ãTOPã¯ææ³å
šäœã§äžèŽãæ¢ãå Žåã«åŒã³åºãããèŠåæ§ã§ãããããŒã¯ã³ãã¯ããæ£èŠè¡šçŸãããããŒã¯ã³ãããã«ãŒã«ããªã©ãèŠåæ§ãæå®ããããã«äœ¿çšããã3ã€ã®èå¥åã®1ã€ã§ãããæ£èŠè¡šçŸãã¯åçŽãªããŒãžã§ã³ã§ãããä»ã®2ã€ã¯ãããŒã¯ã³ããè¿åãçŠæ¢ãããªãã·ã§ã³ã远å ãããã«ãŒã«ããè¿åãçŠæ¢ããã¬ã®ã¥ã©ãŒã·ãŒãºã³ã§æå®ãããã¹ããŒã¹ã®ãªãã©ã«æ€çŽ¢ãå«ã¿ãŸãã ãã«ãŒã«ãã¯äœ¿çšããŸããããã®æ§æã¯ãå¥ã®ååä»ãã¬ã®ã¥ã©ãŒãåŒã³åºãããã«äœ¿çšãããŸããã^^ãã¯ãã¹ãŠã®ããã¹ãã®å§ãŸãã瀺ãã^ããšã¯å¯Ÿç
§çã«ãè¡ã®å§ãŸãã瀺ãããã«äœ¿çšãããŸããè§æ¬åŒ§ã¯ãPerl 5ã§ã¯æååã®é¡äŒŒéšåïŒïŒ:)ã®é
åã«åœ±é¿ãäžããªãã°ã«ãŒãã§ãã=èšå·ã¯ãå·ŠåŽã®å³åŽã«ååãå²ãåœãŠãŸãããã®ææ³ãæ¢ããŠæ€çŽ¢çµæã衚瀺ãããšã©ããªããèŠãŠã¿ãŸãããã my $text = Q { pickmany: ? ac: ac: ac: ai: pickone: ? ac: ai: ai: ai: }; my $match = Question::Grammar.parse($text); say $match.perl;
ããã§ã¯ã232è¡ã®åºåå
šäœãå«ããŸããã1ã€ã®éšåã質åã«ã€ããŠèããŠã¿ãŸãããã
$ matchã¯ã¹ã«ã©ãŒã³ã³ããã«å«ãŸããé
åã§ããããã.flatã䜿çšãããŸããå±±æ¬åŒ§ã¯ã次ã®è¡šèšãšåçã§ãã
ããã¯ããªããžã§ã¯ãã«ååä»ãã¢ã€ãã ãããã·ã¥å€ãšããŠå«ãŸããŠãããç¹°ãè¿ããé
åã«å«ãŸããŠããããšã瀺ããŠããŸããPerl 5ïŒïŒã®ããã«ãæ¬åŒ§ã§äœæãããçµæã®é
åãèŠã€ãã£ãå Žåãè§æ¬åŒ§ã䜿çšããŠäœçœ®é
åãä»ããŠãã®èŠçŽ ã«å°éã§ããŸãïŒé
åãæäœããå Žåãªã©ïŒã次ã®ã¹ãããã¯ãããã€ãã®ã¯ã©ã¹ãäœæãããªããžã§ã¯ãã«åºã¥ããŠããããäŒæããããšã§ããã¯ã©ã¹å®çŸ©ïŒ class Question::Answer { has $.text is rw; has Bool $.correct is rw; } class Question { has $.text is rw; has $.type is rw; has Question::Answer @.answers is rw; }
æ€çŽ¢çµæãã質åãªããžã§ã¯ããäœæããããšã¯ããã»ã©é£ãããããŸããããèŠèŠããã§ãïŒ my @questions = $match<question>.map: { Question.new( text => ~$_<header><text>, type => ~$_<header><type>, answers => $_<answer>.map: { Question::Answer.new( text => ~$_<text>, correct => ~$_<correct> eq 'ac', ) }, ); };
ã¬ã®ã¥ã©ãŒã·ãŒãºã³ã§ç¹°ãè¿ããããšããªããžã§ã¯ãã«é
åã衚瀺ãããããšã«çæããŠã屿§ããšã«mapãå®è¡ããããããã«å¯ŸããŠQuestionãªããžã§ã¯ããäœæããŸããåãšã³ããªã¯fromã®é
åããã©ãã°ããmapã䜿çšããŠQuestion :: Answerãªããžã§ã¯ãã®ãªã¹ããäœæããŸããèŠã€ãã£ãå€ãMathãªããžã§ã¯ãããæååã«å€æããŸãããã®ã¢ãããŒãã¯ã¹ã±ãŒãªã³ã°ããŸããããã®å Žã§ãªããžã§ã¯ããäœæããæ¹ã䟿å©ã§ãããããè¡ãã«ã¯ããªããžã§ã¯ããåŒæ°ãšããŠæž¡ããŸãïŒã¢ã¯ã·ã§ã³ãææ³ã®.parseïŒïŒã¡ãœããã«æž¡ããŸããè§£æãšã³ãžã³ã¯ãåŠçãããéåžžã®ååãšåãååã®ã¡ãœãããåŒã³åºããMatchãªããžã§ã¯ããåŒæ°ãšããŠæž¡ãããŸããã¡ãœãããå®è¡æã«ãmakeïŒïŒããåŒã³åºãå ŽåããmakeïŒïŒãã®åŒæ°ã¯.ast屿§ãšããŠæžã蟌ãŸããŸãïŒãæœè±¡æ§æããªãŒããMatchãªããžã§ã¯ãã®æœè±¡æ§æããªãŒïŒãããããããã¯ããªãæœè±¡çãªãã®ã§ããã³ãŒããèŠãŠã¿ãŸãããã3ã€ã®ã¬ã®ã¥ã©ãŒãšåãååã®ã¡ãœãããæã€ã¯ã©ã¹ãå¿
èŠã§ãã class Question::Actions { method TOP($/) { make $<question>».ast; } method question($/) { make Question.new( text => ~$<header><text>, type => ~$<header><type>, answers => $<answer>».ast, ); } method answer($/) { make Question::Answer.new( correct => ~$<correct> eq 'ac', text => ~$<text>, ); } }
$ /ã¯Matchãªããžã§ã¯ãã®äŒçµ±çãªååã§ã$ _ãšåãããã«ç¹å¥ã§ã-屿§ã«ã¢ã¯ã»ã¹ããããã®ç¹å¥ãªæ§æããããŸãã倿°ïŒ$ããã³$ [1]ïŒãªãã®ååãŸãã¯äœçœ®ãä»ããã¢ã¯ã»ã¹ã¯ã$ /ïŒ$ /ããã³$ / [1]ïŒãžã®ã¢ã¯ã»ã¹ã«å€æãããŸããéãã¯1æåã§ãããèŠèŠçãªãã€ãºãé¿ããPerl 5ã®$ 1ã$ 2ã$ 3ã«äŒŒãã»ãã³ãã£ãã¯æ§é ã䜿çšã§ããŸããTOPã¡ãœããã§ã¯ãã¡ãœããã®ãã€ããŒã¡ãœããåŒã³åºãã䜿çšããŠã$ã®åã¢ã€ãã ã®.ast屿§ã®ãªã¹ããäœæããŸããã¢ã¯ã·ã§ã³ã¡ãœããã§makeãåŒã³åºããšããã¯ã©ãã§ããè¿ãããMatchãªããžã§ã¯ãã®.ast屿§ãšããŠäœããå®çŸ©ãããããããã¯è³ªåã¡ãœããã§è¡ããã®ãžã®åŒã³åºãã«ãããŸããããquestionãã¡ãœããã§ã¯ãæ°ããQuestionãªããžã§ã¯ããäœæããäžèŽãªããžã§ã¯ããããã¹ãŠã®å±æ§ãæž¡ããéåžžã®ãanswerãéåžžã®è³ªåãquestionãã®ååŒã³åºãã§ååŸãããªããžã§ã¯ãã®ãªã¹ãã«ãanswerã屿§ãå²ãåœãŠãŸãããanswerãã¡ãœããã§ã¯ã屿§ã®ãBoolãã¿ã€ãã«åãããã«ãæ£ããã屿§ã«æ¯èŒçµæãå²ãåœãŠãããšã§åãããšãè¡ããŸããè§£æãããšãããã®æ°ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠæž¡ããŸãïŒactionãgrammar .parseã¡ãœããã«æž¡ããŠãããè¿ãããæ€çŽ¢ãªããžã§ã¯ãã®.ast屿§ããæ§ç¯ããããªããžã§ã¯ããååŸããŸããç§ã®$ã¢ã¯ã·ã§ã³=質å:: Actions.newïŒïŒ;ç§ã®è³ªå =質å:: Grammar.parseïŒ$ããã¹ããïŒã¢ã¯ã·ã§ã³ïŒ$ã¢ã¯ã·ã§ã³ïŒïŒãast.flat;ããã§ãäœæãããªããžã§ã¯ãããã§ãã¯ããŠããã¹ãŠãèšç»ã©ããã«é²ãã§ããããšã確èªã§ããŸãã for @questions -> $q { say $q.text; for $q.answers.kv -> $i, $a { say " $i) {$a.text}"; } }
å®å
šãæãããã«ã質åãè¡ããåçãååŸããŠè©äŸ¡ããã¡ãœãããQuestionã«è¿œå ããŸãããã質åãåçãããã³å
¥åèŠæ±ã®æç€ºããå§ããŸãããã method ask { my %hints = ( pickmany => " , ", pickone => " ", ); say "\n{%hints{$.type}}\n"; say $.text; for @.answers.kv -> $i, $a { say "$i) {$a.text}"; } print "> ";
STDINããè¡ãååŸããããããæ°å€ãæœåºããŸãã my $line = $*IN.get(); my @answers = $line.comb(/<digit>+/)>>.Int.sort
ããããã¯ãåå²ãã®å察ã§ããã€ãŸããæšãŠãå¿
èŠããããã®ã§ã¯ãªããæ®ãå¿
èŠããããã®ã決å®ãããšããæå³ã§ããå©ç¹ã¯ãå颿åãéžæããå¿
èŠããªãããšã§ãããŠãŒã¶ãŒã¯ã1 2 3ããã1ã2ã3ãããŸãã¯ã1ã2ã3ããšå
¥åããããšãã§ããŸããæ¬¡ã«ãhyperoperatorã¡ãœãããåŒã³åºããŠãèŠã€ãã£ãæåã®é
åããæŽæ°ã®é
åãäœæããäžŠã¹æ¿ããŸããæ¬¡ã«ããã¹ãŠã®æ£è§£ã®ã€ã³ããã¯ã¹ã®é
åãäœæããæ£è§£ãèŠã€ããŸãããã my @correct = @.answers.kv.map({ $^value.correct ?? $^key !! () }); if @correct ~~ @answers { say ", !"; return 1; } else { say " , "; return 0; } }
ããããã®è³ªåã«å¯ŸããŠãããåŒã³åºããæ°ããã¡ãœããã®ããããéããŠçµæãåéããŸãã my @results = @questions.map(*.ask); say "\nFinal score: " ~ [+] @results;
çµæã¯æ¬¡ã®ããã«ãªããŸãã [sweeks@kupo ~]$ perl6 /tmp/questions.pl , ? 0) 1) 2) 3) > 0 1 2 , ! ? 0) 1) 2) 3) > 1 , : 1
ããã°ã©ã ã®å
šæã¯æ¬¡ã®ãšããã§ãã class Question::Answer { has $.text is rw; has Bool $.correct is rw; } class Question { has $.text is rw; has $.type is rw; has Question::Answer @.answers is rw; method ask { my %hints = ( pickmany => " , ", pickone => " ", ); say "\n{%hints{$.type}}\n"; say $.text; for @.answers.kv -> $i, $a { say "$i) {$a.text}"; } print "> "; my $line = $*IN.get(); my @answers = $line.comb(/<digit>+/)>>.Int.sort @correct = @.answers.kv.map({ $^value.correct ?? $^key !! () }); if @correct ~~ @answers { say " , !"; return 1; } else { say " , "; return 0; } } } grammar Question::Grammar { token TOP { \n* <question>+ } token question { <header> <answer>+ } token header { ^^ $<type>=['pickone'|'pickmany'] ':' \s+ $<text>=[\N*] \n } token answer { ^^ \s+ $<correct>=['ac'|'ai'] ':' \s+ $<text>=[\N*] \n } } class Question::Actions { method TOP($/) { make $<question>».ast; } method question($/) { make Question.new( text => ~$<header><text>, type => ~$<header><type>, answers => $<answer>».ast, ); } method answer($/) { make Question::Answer.new( correct => ~$<correct> eq 'ac', text => ~$<text>, ); } } my $text = Q { pickmany: ? ac: ac: ac: ai: pickone: ? ac: ai: ai: ai: }; my $actions = Question::Actions.new(); my @questions = Question::Grammar.parse($text, :actions($actions)).ast.flat; my @results = @questions.map(*.ask); say "\n : " ~ [+] @results;
ãªãã¬ãŒã¿ãŒã®éè² è·
Perl 6ã§ã¯ãæ¢åã®æŒç®åããªãŒããŒããŒãããæ°ããæŒç®åãå®çŸ©ã§ããŸããæŒç®åã¯ãç¹å¥ãªååãæã€åçŽãªãã«ãããã·ãŒãžã£ã§ããããã«ãããã·ãŒãžã£ã®æšæºã«ãŒã«ã䜿çšããŠãç®çã®æŒç®åããªã¢ã³ããæ±ºå®ããŸããäžè¬çãªäŸã¯ãæ°åŠç衚èšã«äŒŒãé乿Œç®åã®å®çŸ©ã§ãã multi sub postfix:<!>(Int $n) { [*] 1..$n; } say 3!;
å®çŸ©ã®æåã®éšåã¯ãæ§æã«ããŽãªïŒãã¬ãã£ãã¯ã¹ããã¹ããã£ãã¯ã¹ãã€ã³ãã£ãã¯ã¹ããµãŒã«ã ãã£ãã¯ã¹ããŸãã¯ãã¹ããµãŒãã¥ãã£ãã¯ã¹ïŒã§ããã³ãã³ã®åŸã«ã¯ãæŒç®åãèšè¿°ãããŠããå±±æ¬åŒ§ããããŸãããµãŒã«ã ãã£ãã¯ã¹ã®å Žåã2çµã®ãã©ã±ãããå¿
èŠã§ãããä»ã®ãã¹ãŠã®ãã©ã±ããã«ã¯1ã€ã§ååã§ããã®äžã«è€æ°ã®æåãå«ãŸããå ŽåããããŸããäŸã§ã¯ãåŸçœ®æŒç®åãå®çŸ©ããŸããïŒæŽæ°ã®æäœãtighterãequivãlooseãªã©ã®è¿œå 屿§ãèšå®ããŠãä»ã®æŒç®åãããåªå
é äœãæå®ã§ããŸããæ¢åã®æŒç®åã®çœ®æãæå®ãããšãæ°ããå®çŸ©ã¯ãã®ãã«ãããã·ãŒãžã£ã®ã»ããã«åçŽã«è¿œå ãããŸããããšãã°ãã¯ã©ã¹ãå®çŸ©ãã+æŒç®åã䜿çšããŠãã®ãªããžã§ã¯ãã远å ã§ããããšã決å®ã§ããŸãã class PieceOfString { has Int $.length; } multi sub infix:<+>(PieceOfString $lhs, PieceOfString $rhs) { PieceOfString.new(:length($lhs.length + $rhs.length)); }
ãã¡ãããå®éã®äŸã¯ããè€éã§ãããã€ãã®å€æ°ãå«ãŸããŠããŸããæååã®ç䟡æ§ãã§ãã¯ãæå®ã§ããŸãã multi sub infix:<==>(PieceOfString $lhs, PieceOfString $rhs --> Bool) { $lhs.length == $rhs.length; }
é¿ããã¹ãããšã¯ããã¬ãã£ãã¯ã¹æŒç®åã®ãªãŒããŒããŒãïŒ<ã>ïŒæååãžã®å€æïŒã§ãããããè¡ããšããã¹ãŠã®æåå倿ãååããããšãã§ããªããªããŸãã代ããã«ããžã§ããå®è¡ããStrã¡ãœãããã¯ã©ã¹ã«å®çŸ©ããã®ãæåã§ãã use MONKEY_TYPING; augment class PieceOfString { method Str { '-' x $.length; } }
ãã®ã¡ãœããã¯ãåŸæ¥ã®ãæŒç®åã«ãã£ãŠåŒã³åºãããŸããååãåãšäžèŽããã¡ãœããã¯åã®å€æã«äœ¿çšãããããããããçã«ããªã£ãŠããå Žåã¯ãStrã¡ãœãããšNumã¡ãœãããã¯ã©ã¹ã«èšå®ã§ããŸãããŸããPerl 6ã®ãœãŒã¹ã³ãŒãã¯Unicodeã§èšè¿°ãããŠãããããè±å¯ãªæåã䜿çšããŠæ°ããæŒç®åãå®çŸ©ã§ããŸãããšãã³ã®åã®æ fruitsãªæç©ä»ã®èšèªã§ã¯ããŸãèŠãããªããã¶ã€ã³ãèããŠã¿ãŸããã-ã®ã£ã¶ãŒãšåŒã°ããå埩åã³ã³ã¹ãã©ã¯ã¿ãŒã§ããæŽå²çã«ãå€ãã®ãªãªã ã®æ€ç©ã¯äŸ¿å©ãªããããgrepãããã³ãœãŒãæ©èœãç¥ã£ãŠããŸãã my @squares = map { $_ * $_ }, @numbers; my @primes = grep { is-prime($_) }, @numbers;
mapãšgrepã¯ãããããé£éãããæ¹æ³ãåŠã¶ãšãã«ç¹ã«åœ¹ç«ã¡ãŸãã my @children-of-single-moms = map { .children }, grep { !.is-married }, grep { .gender == FEMALE }, @citizens;
ããã«ããããã®å Žåã®ãã£ãã·ã³ã°ã®ã€ãã£ãªã ã§ããã·ã¥ã¯ã«ã倿ãäœæãããŸããããœãŒãããªãœãŒã¹ãéäžçã«äœ¿çšããå ŽåïŒ my @files-by-modification-date = map { .[0] },
åã®äŸã®1ã€ã¯ããã®å€æãã©ã®ããã«ãœãŒãã«çµã¿èŸŒãŸãããã瀺ããŸããã my @files-by-modification-date = sort { $_ ~~ :M }, @files;
ã§ã¯ãã®ã£ã¶ãŒã¯ã©ãã§ããïŒããã¯ãmapãšgrepã®ãã®ãããªäžè¬åã§ãã sub mymap(&transform, @list) { gather for @list { take transform($_); } }; sub mygrep(&condition, @list) { gather for @list { take $_ if condition($_); } };
次ã®ãããã¯å
ã«ãªã¹ããäœæããŠãããšããã·ã°ãã«ãåéããŸããåãã€ã¯ã«èŠçŽ ã远å ãããŸããããã¯ãå¿åé
åã«ããã·ã¥ããæ¹æ³ã§ãã my @result = gather { take $_ for 5..7 };
Gatherã®æåã®ããããã£ã¯ãmapãgrepãsortãååã§ã¯ãªããšãã«ãªã¹ããäœæãããšãã«äœ¿çšãããããšãããããŸãããã¡ãããããããåçºæããªãã§ãã ãã...ãããããããå¯èœã§ãããšããäºå®ã¯ãç¬èªã®ç¹å¥ãªèŠä»¶ãèšå®ããªãããããããã§ãã sub incremental-concat(@list) { my $string-accumulator = ""; gather for @list { take ~($string-accumulator ~= $_); } }; say incremental-concat(<ab c>).perl;
ç¹°ãè¿ãã®éã«$ string-accumulatorãåŠçããå¿
èŠããããããäŸã¯mapãã䟿å©ã§ããGatherã®2çªç®ã®ããããã£-takeåŒã³åºãã¯Gatherãããã¯ã®ã¹ã³ãŒãã§çºçããå¿
èŠããããŸãããã¬ãã·ã«ã«é åã«ããå¿
èŠã¯ãããŸãã-ãã€ãããã¯ã«ã®ã¿ã§ããéããçè§£ããŠããªã人ã®ããã«ãç§ã¯èª¬æããŸãïŒ sub traverse-tree-inorder(Tree $t) { traverse-tree-inorder($t.left) if $t.left; take transform($t); traverse-tree-inorder($t.right) if $t.right; } my $tree = ...; my @all-nodes = gather traverse-tree-inorder($tree);
ããã§ã¯ãïŒtraverse-tree-inorderåŒã³åºããGatherã¹ããŒãã¡ã³ãã§ã©ããããŸããåœä»€èªäœã«ã¯ååŸããã¬ãã·ã«ã«ã³ãŒã«ã¯å«ãŸããŠããŸããããåŒã³åºãããããã·ãŒãžã£ã«ã¯å«ãŸããŠãããããå
éšã§ååŸããããšã¯ãgatherã®ã³ã³ããã¹ãå
ã«ããããšãèŠããŠããŸããããã¯åçãªã³ã³ããã¹ãã§ããGatherã®3çªç®ã®ããããã£ã¯ããé
å»¶ãã§ããããªãŒãã©ããŒãµã«ã³ãŒãã®å Žåãããã¯ã@ all-nodeså²ãåœãŠãå®è¡ããããšããããªãŒããŸã ãã€ãã¹ãããŠããªãããšãæå³ããŸããã¯ããŒã«ã¯ãé
åã®æåã®èŠçŽ @ all-nodes [0]ã«ã¢ã¯ã»ã¹ãããšãã«ã®ã¿éå§ãããŸãããããŠã巊端ã®é ç¹ãèŠã€ãããšåæ¢ããŸãã @ all-nodes [1]ããªã¯ãšã¹ã-ãã¢ãŒã¯ã2çªç®ã®é ç¹ãèŠã€ããåŸã«åæ¢ããããã«ãçµäºããå ŽæããåéããŸããã€ãŸããåéãããã¯å
ã®ã³ãŒãã¯ãèŠæ±ããã以äžã®äœæ¥ãè¡ããªãããã«éå§ããã³åæ¢ããŸããããããé
å»¶ãåäœã§ããå®éãããã¯é
å»¶å®è¡ã§ããPerl 6ã¯Gatherãããã¯å
ã§ã³ãŒããå®è¡ããããšãçŽæããŸããããã®æ
å ±ãå¿
èŠãªå Žåã®ã¿ã§ããè峿·±ãããšã«ãã»ãšãã©ãã¹ãŠã®é
åã¯ããã©ã«ãã§é
å»¶ããŠããããã¡ã€ã«ãããè¡ãèªã¿åããŸããmapãšgrepã¯ãgatherã䜿çšããŠäœæã§ããã ãã§ãªãããããèªäœãæ zyã§ãããã®åäœã«ãããã¹ã¬ããã®ããã°ã©ãã³ã°ãç¡éé
åã®äœ¿çšãå¯èœã«ãªããŸãã my @natural-numbers = 0 .. Inf; my @even-numbers = 0, 2 ... *;
æåŸã®æé ã¯ãPerl 6ã®ããã³ã°åé¡ã解決ããããšã§ããæ¬¡ã¯ãã¯ãªã¹ãã¹ããªãŒãçªç¶æç»ããã»ã«ãªãŒãããã³ãå®è£
ããæ¬¡ã®ãæå³äžæãã§ãã $ perl6 -e 'my %r=[^8]>>.fmt("%03b") Z (0,1,1,1,1,0,0,0);\ say <. X>[my@i=0 xx 9,1,0 xx 9];\ for ^9 {say <. X>[@i=map {%r{@i[($_-1)%19,$_,($_+1)%19].join}},^19]};' .........X......... ........XXX........ .......XX..X....... ......XX.XXXX...... .....XX..X...X..... ....XX.XXXX.XXX.... ...XX..X....X..X... ..XX.XXXX..XXXXXX.. .XX..X...XXX.....X. XX.XXXX.XX..X...XXX
Perl 6æšæºææ³
ææ³ãèšèªã®éèŠãªæ§æèŠçŽ ãšåŒã¶ã®ã¯å¥åŠã§ããæããã«ãæ§æã¯éåžžã«éèŠã§ã-ããããå®çŸ©ããåŸã¯ãææ³ã䜿çšããŠæ§æãèšè¿°ããããŒãµãŒãæ§ç¯ããã ãã§ãããïŒPerl 6ã§ã¯ãªããæ§æã¯åçã§ããæ°ããããŒã¯ãŒããå
ã®ãã¶ã€ã³ã§ã¯ã«ããŒãããŠããªããã®ãèå¥ããã®ã«åœ¹ç«ã¡ãŸããããæ£ç¢ºã«ã¯ãPerl 6ã¯èšèªæ§æã倿Žããã¢ãžã¥ãŒã«ãšã¢ããªã±ãŒã·ã§ã³ããµããŒãããŸãããã®èšèªã¯ãæ°ããæŒç®åã®å®çŸ©ã«å ããŠããã¯ããåœä»€ã®çš®é¡ãæåãªã©ã®åçãªè¿œå ããµããŒãããŠããŸããææ³ã®éèŠãªç¹åŸŽã¯ãæ£èŠè¡šçŸã®äœ¿çšã§ããPRVã§ã¯ãè€æ°ã®ã¬ã®ã¥ã©ãŒã1ã€ã®ã«ããŽãªã«çµã¿åãããããšãã§ããŸããããäŒçµ±çãªææ³ã§ã¯ã次ã®ããã«æžããŸãã rule statement { | <if_statement> | <while_statement> | <for_statement> | <expr> } rule if_statement { 'if' <expr> <statement> } rule while_statement { 'while' <expr> <statement> } rule for_statement { 'for' '(' <expr> ';' <expr> ';' <expr> ')' <stmt> }
PRVã§ã¯ã次ã®ããã«èšè¿°ããŸãã proto token statement { <...> } rule statement:sym<if> { 'if' <expr> <statement> } rule statement:sym<while> { 'while' <expr> <statement> } rule statement:sym<for> { 'for' '(' <expr> ';' <expr> ';' <expr> ')' <stmt> } rule statement:sym<expr> { <expr> }
説æããæ§é ã®ããããã§äžèŽãæ¢ããŠãããšå€æããŸãããPRVããŒãžã§ã³ã®æ¡åŒµã¯ã¯ããã«ç°¡åã§ããæåã®ããŒãžã§ã³ã§ã¯ãæ°ããã¹ããŒãã¡ã³ãïŒãrepeat..untilããªã©ïŒã远å ããã«ã¯ããruââle statementã宣èšå
šäœãæžãçŽãå¿
èŠããããŸããããããPRVã§ã¯ããã1ã€ã®ã«ãŒã«ã远å ããã ãã§ãã rule statement:sym<repeat> { 'repeat' <stmt> 'until' <expr> }
ãã®ã«ãŒã«ã¯ãPDPã®åè£ã«è¿œå ãããŸãããããŠãããã¯æ°ããææ³ããŒãžã§ã³ã§åäœããŸãïŒ grammar MyNewGrammar is BaseGrammar { rule statement:sym<repeat> { 'repeat' <stmt> 'until' <expr> } }
MyGrammarã¯ãbaseGrammarãšåãæ¹æ³ã§ãrepeat..untilæŒç®åã®è¿œå å®çŸ©ã䜿çšããŠè§£æããŸããæšæºææ³ã®ãã1ã€ã®æçšãªã³ã³ããŒãã³ãã¯ãé«åºŠãªãšã©ãŒèšºæã§ãããããã§ãšã©ãŒãã®ãããªã¡ãã»ãŒãžã®ä»£ããã«ãèšèªã¯ããã解決ããããã®ãªãã·ã§ã³ãæäŸããŸããããã«ãPerl 5ããPerl 6ã«ç§»è¡ããéã«ã倿Žãããå€ã®æ§æããã¬ãŒã¹ããã®ãæ¯æŽããåªåããªãããŸãããããšãã°ãunlessãããã¯ã§elseã䜿çšããããšãããšããšã©ãŒãçºçããŸãã unless does not take "else" in Perl 6; please rewrite using "if"
ãŸãã¯ãäžé
æŒç®åïŒïŒ:)ã䜿çšãããšãããŒãµãŒã¯ä»¥äžãè¿ããŸãã Unsupported use of "?:"; in Perl 6 please use "??!!"
Rakudoã³ã³ãã€ã©ã«é©çšãããæ°ããPerl 6èšèªã«é¢ããã¡ã¢ããæ¥œãã¿ãã ããã