2015/10/26

Recent entries from same category

  1. Perl6 の grammar で俺言語「しょぼいスクリプト」を作った。
  2. C言語に Perl6 を埋め込む。
  3. Perl6 の CPAN Author になりました。
  4. Perl6 で俺俺 Gyazo 作った。
  5. Perl6 の Panda でインストールがちゃんと出来なくなった場合の修正方法。

Perl には x 演算子があり、x 3 といった具合に繰り返し回数を付ける事で連続した文字列を簡単に作り出すことが出来る。

say 1 x 3; # 111
say "foo" x 3; # foofoofoo

これは Perl5 でもお馴染み。しかし Perl6 の Range は凄い。

say 1 xx 3; # (1 1 1)
say "foo" xx 3; # (foo foo foo)

連続した配列要素が作り出せる。それどころか無限リストが作り出せる。

say 1 xx *; # (...)
say "foo" xx *; # (...)

もちろん無限数列も作れる。

(1 .. *)[^10].perl.say; # (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

fibonacci 数列もこんなに簡単。

(1, 1, *+* ...^ *)[^100].perl.say;

上記の様に無限リストをスライスするには [^10][40..42] の様に指定する。要素は数字や文字列に限った話ではない。

my $a = <a b c>;
my $b = $a xx *;
say $b[^5]; # ((a b c) (a b c) (a b c) (a b c) (a b c))

配列の繰り返しも可能だし、| を使えばダイナミックバインディングも使える。

my $a = <a b c>;
my $b = |$a xx *;
say $b[^10]; # (a b c a b c a b c a)

応用すれば FizzBuzz だって。

my $r = 0;
my $a = sub {
  $r++;
  given 0 {
  when $r % 15 { "FizzBuzz" }
  when $r % 3 { "Fizz" }
  when $r % 5 { "Buzz" }
  default { $r };
  }
};
my $b = |$a() xx *;
say $b[^20];

この |、実は凄くて

multi sub foo(Str $a) {
  say "foo1";
}

multi sub foo(Str $a, Str $b) {
  say "foo2";
}

my $a = <a>;
foo |$a; # foo1

$a = <a b>;
foo |$a; # foo2

メソッドのダイナミック呼び出しも出来る。Perl6 凄い。

Posted at by | Edit