トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PERL6

「ラブ・ストーリーは突然に」

突然、PERL6(パールシックス)が気になってきた。今年(2015)はラリーからのクリスマスプレゼントがあるらしい(わくわく)


[wikipediaより]

言語仕様は現在のPerl (Perl 5)と互換性がなく、既存のPerl 5のソフトウェアをPerl 6用に「アップグレード」するのは極めて困難である。したがって現在はPerl 5とPerl 6は別の言語であると考えられており、Perl 6はPerl 5の次期バージョンではないとされている。換言すれば、Perl 6はPerl 5から移行対象とはみなされていない。

ところが、inline::perl5とはなんだ……気になる


Perl の現状より

Perl に未来があるか

  • Perl が有効で、優れた働きをしていることは確かです。Perl 6 の開発チームは、次世代のPerl 言語を定義するため、精一杯の仕事をしています。別のチームの開発者は、Perl 6 の次世代の実行時エンジンである Parrot で精一杯の仕事をしています。Parrot は、Perl 6 のような動的な言語をサポートするだけでなく、Python や Ruby などもサポートするようにデザインされています。Perl 6 は、既存の Perl 5 コードの透過的な移行もサポートしています。
  • Perl の成功を、他の何らかの言語の失敗に基づいて述べることはできません。Perl の成功は、あなたの仕事を終わらせるのを助けてくれるかどうかにかかっているのです。

perl6は仕様、実装はrakudoとかparrotとか

ubuntuにセットアップ

$ sudo apt-get install rakudo
$ perl6 -v
This is perl6 version 2014.07 built on parrot 6.6.0 revision 0
$ 
$ perl6 -V
parrot::git_describe=0
parrot::sha1=0
parrot::a=.a
parrot::ar=ar
parrot::ar_extra=
parrot::ar_out=
parrot::archname=i686-linux-gnu-thread-multi-64int
 .
 .
 .
perl6::name=rakudo
perl6::version=2014.07
perl6::release-number=
perl6::codename=
perl6::build-date=2014-12-02T21:01:35Z
$ 
$ parrot -V
This is Parrot version 6.6.0 built for i386-linux
Copyright (C) 2001-2014, Parrot Foundation.

This code is distributed under the terms of the Artistic License 2.0.
For more details, see the full text of the license in the LICENSE file
included in the Parrot source tree

$ 

hello world

やっぱり最初は

$ perl6 -e 'say "Hello world"'
Hello world
$ 
$ perl6 -e "say 'こんにちは世界'"
こんにちは世界
$ 
  • 1から10までを加算する
$ perl6 -e 'sub f($n){$n>1 ?? $n+f($n-1)!!$n};say f(10)'
55
$ perl6 -e 'say [+] 1..10'
55
$ 
  • [配列、ハッシュ、関数]のリファレンス
$ perl6 -e 'my $x = sub{say "hello!"};$x.();$x=(1..10);say $x.reverse;$x={A=>41,B=>42};say $x.values'
hello!
10 9 8 7 6 5 4 3 2 1
41 42
$ 

shell sort

まだ、いまいち(理由解らん!)

[shellsort.pl6]

say join ( ',',ssrt ( sub ($a,$b) { $b gt $a } ,0..10));
  
sub swap ($f,$j,$h,$x) {
  loop ( ; $j>=$h ; $j-=$h ) {
     return $x if($f.( $x.[ $j-$h ],$x.[ $j ] ) );
     $x.[ $j-$h ],$x.[ $j ] = $x.[ $j ],$x.[ $j-$h ];
  }
} 
sub loop1 ($f,$h,$x) {
  loop (my $i=$h ; $i<=$#x ; $i++i) {
    swap ($f,$i,$h,$x);
  }
}
sub ssrt {
  my $f=shift;
  my @x=@_;
  my $h=1;
  loop ( ;$h < @x / 9 ; $h=$h*3+1 ) { };
  loop ( ;$h > 0 ; $h=int($h/3) ) { 
    loop1 ($f,$h,@x);
  } 
  return @x;
} 
__END__
$ perl6 shellsort.pl6
===SORRY!=== Error while compiling shellsort.pl6
Unable to parse quote-words subscript; couldn't find right angle quote
at shellsort.pl6:27
------> <BOL>&#9167;<EOL>
   expecting any of:
       postfix
$ 
  • エラーの意味が解らん。誰かおしえて!!! - John (2015年06月23日 20時51分44秒)
my ($f,$h,@x); 
say join  ',',ssrt ( anon sub op ($a,$b) { $a gt $b } , (0..100));
  
sub swap (@x1) {
  my ($j,$h) = @x1;
  loop ( ; $j>=$h ; $j-=$h ) {
     return 0 if($f.( @x[ $j-$h ], @x[ $j ] ) );
     (@x[ $j-$h ],@x[ $j ]) = (@x[ $j ],@x[ $j-$h ]);
  }
} 
sub loop1 ( $h ) {
  loop (my $i=$h ; $i <= +@x ; $i++) {
    swap ($i,$h);
  }
}
sub ssrt ( @x1 ){
say @x1;
  ($f,@x) = (@x1);
  my int $h=1;
  loop ( ;$h < (@x / 9) ; $h=$h*3+1 ) { };
  loop ( ;$h > 0 ; $h=Int($h/3) ) { 
    loop1 ( $h );
  } 
  return @x;
} 
$ perl6 shellsort.pl6
sub op (Any $a, Any $b) { #`(Sub|287108521) ... } 0..100
use of uninitialized value of type Any in string context  in sub op at shellsort.pl6:2

use of uninitialized value of type Any in string context  in sub op at shellsort.pl6:2

use of uninitialized value of type Any in string context  in sub op at shellsort.pl6:2

99,98,97,96,95,94,93,92,91,90,9,89,88,87,86,85,84,83,82,81,80,8,79,78,77,76,75,74,73,72,71,70,7,69,68,67,66,65,64,63,62,61,60,6,59,58,57,56,55,54,53,52,51,50,5,49,48,47,46,45,44,43,42,41,40,4,39,38,37,36,35,34,33,32,31,30,3,29,28,27,26,25,24,23,22,21,20,2,19,18,17,16,15,14,13,12,11,100,10,1,0
$ 
  • とりあえず動いた!!!
    • まだ解らない亊
      • サブルーチンシグネチャの使い方
      • shift,unshift,pop,pushとか
      • ワンライナで";"が必要な亊
my ($f,$h,@x); 
say join  ',',ssrt ( anon sub op ($a1,$b1) { $a1 gt $b1 } , (0..10));
  
sub swap (@x1) {
  my ($j,$h) = @x1;
  loop ( ; $j>=$h ; $j-=$h ) {
     return 0 if $f.(@x[$j-$h], @x[$j]);
     @x[$j-$h,$j] = @x[ $j,$j-$h];
  }
} 
sub loop1 ($h) {
  loop (my $i=$h ; $i < +@x ; $i++) {
    swap ($i,$h);
  }
}
sub ssrt ( @x1 ){
  ($f,@x) = (@x1);
  my int $h=1;
  loop ( ;$h < (@x / 9) ; $h=$h*3+1 ) { };
  loop ( ;$h > 0 ; $h=Int($h/3) ) { 
    loop1 ( $h );
  } 
  return @x;
} 
=begin END
perl6 -e 'my ($f,$h,@x); sub swap (@x1) { my ($j,$h) = @x1; loop ( ; $j>=$h ; $j-=$h ) { return 0 if $f.(@x[$j-$h], @x[$j]); @x[$j-$h,$j] = @x[ $j,$j-$h]; } } ;sub loop1 ($h) { loop (my $i=$h ; $i < +@x ; $i++) { swap ($i,$h); } } ;sub ssrt ( @x1 ){ ($f,@x) = (@x1); my int $h=1; loop ( ;$h < (@x / 9) ; $h=$h*3+1 ) { }; loop ( ;$h > 0 ; $h=Int($h/3) ) { loop1 ( $h ); } ;return @x; };say join  ",",ssrt ( anon sub op ($a1,$b1) { $a1 gt $b1 } , (0..10));' 
$ perl6 shellsort.pl6
9,8,7,6,5,4,3,2,10,1,0
$ 

3の倍数でfoo、5の倍数でbazと数える

$ perl6 -e 'say map {($_%3??""!!"foo") ~ ($_%5??""!!"baz") or $_},1..31'
1 2 foo 4 baz foo 7 8 foo baz 11 foo 13 14 foobaz 16 17 foo 19 baz foo 22 23 foo baz 26 foo 28 29 foobaz 31
$ 

正規表現で素因数分解

遅い…(遅すぎる)

$ perl6 -e 'sub f($x){my @ans =();my $N= "o"x$x;my $s;loop (;$N ~~ /^(oo+?)$0+$/;$N ~~ s:g/$s/o/) {$s=$0;push(@ans,chars($s));};push(@ans,chars($N)); join("x",@ans);} ;say f(10920);'
2x2x2x3x5x7x13
$
$ perl6 -e 'my @a; sub f{ my ($x,$y)=@_[0,1]; if $y > sqrt($x) { return push(@a,$x); }; if $x%$y { f($x,$y+1); } else { push(@a,$y); f($x/$y,$y); } }; sub MAIN($x){ f($x,2); say join "x",@a; }' 10920
2x2x2x3x5x7x13
$ 

飛び出せperl6

アスキーでステレオグラム。ワンライナーで『パール6』を浮き出させる。いまいち飛び出ないか…。もっとガンガレ…

$ perl6 -e 'sub MAIN($x,$y){ for 1..10 -> $i { for 1..7 -> $j { print ($i==9 and $j==6)??"$y "!!"$x ";}; print "\n";}}' ...perl... ..perl6...
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ..perl6... ...perl... 
...perl... ...perl... ...perl... ...perl... ...perl... ...perl... ...perl... 
$

フィボナッチ数列

yapcasia 2015 day1でラリーがデモしてた。(ちょっと違うけど)perl6すげー

$ perl -E 'sub f{$_[0] < 1?$_[2]:f($_[0]-1,$_[1]+$_[2],$_[1])} say join ",", map {f($_,1,0)} (0..30)'
$ perl6 -e 'my @Fib := 0, 1, * + * ... *;say @Fib[1..30]'
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040