こんにちは!
Perl6初心者です!
Perl6のドキュメントは http://design.perl6.org/ で読むことができるようです。
今回は無限リストで遊んでみましょう。
Perl6では無限リストを作ることができます。
たとえば、1
から Inf
までの無限リストは以下のようにして作ることが出来ます。
Rangeを使った無限リスト
(1...Inf)
Inf
を *
と表現することもできるのでもっと簡潔に書くこともできます。
(1...*)
関数を使った無限リスト
無限リストということで、Sub...Inf
のように書くことで関数も扱うことが出来ます。
たとえばランダムで True
または False
が返る無限リストを作ることができます。
(-> { (True, False).pick } ... *)
さらに、初期値を与えることで、前回の値をもとに次の値を生成するといったこともできます。
等差数列を簡単につくることができますね。
(1, -> $n { $n + 3 } ... *)
なお、値を取る場合は、引数を *
で表すことでラムダ式を以下のように簡易的に書くこともできます。
(1, * + 3 ... *)
2つ以上の値を初期値として取ることもできます。
(0, 1, * + * * 2 ... *)
これを発展させると、mattnさんの Perl6 の無限リストとダイナミックバインディングが最強すぎる で書かれているようなフィボナッチ数列を表す無限リストを書くことができます。
詳しくは tokuhiromさんが解説している のでそっちを読むと良いです。
当たり前に無限リストに対するmap/grepなどもできます。
(1...*) ==> map { $_ + 2 }
あそぶぞー
FizzBuzzでもやってみましょうかね!
mapで書いてみる。
(1...*) ==> map { $_ % 15 == 0 ?? "FizzBuzz" !! $_ % 5 == 0 ?? "Buzz" !! $_ % 3 == 0 ?? "Fizz" !! $_ }
関数でも書いてみる。
クロージャにすることでうまくいった。もっとすっきり書けそう。
my $n = 0;
(-> { $n++; $n % 15 == 0 ?? "FizzBuzz" !! $n % 5 == 0 ?? "Buzz" !! $n % 3 == 0 ?? "Fizz" !! $n } ... *)
無限リストをO/R Mapperで採用する可能性
無限リストでデータベースを扱うことも可能かもしれませんね!(愚直にやるとクソクエリ吐きそうだけど)
my ($user1, $user2, $user3) = DB.users()[1..3]
まとめ
無限リストたのしい!
明日は @B73W56H84 さんによる "Perl6 Cookbook的な内容!" です。おたのしみに!