こんにちは、Perl 6アドベントカレンダーの17日目の投稿になります。
今日はPerl6ishにFizzBuzzしましょう。
読み進める前に
注意!
- 読者レベルとしては、Perl 6アドベントカレンダー1日目で紹介したPerl 6 introductionなどのチュートリアルを一通り終えたレベルを想定しています。
- わかりやすく紹介するために、正確ではない表現がところどころ出てくるかもしれません。
- より正確な情報を知りたい場合は、Perl 6アドベントカレンダー1日目で紹介した公式ドキュメント や公式テストケースのroastなどを参照ください。
- 日本語訳が定着していないようなPerl 6独特の英単語を目にするかもしれません。基本的に解説中ではそのまま英単語で書き、その後補足しますのでご容赦ください。
- Perl 6のモットーはTMTOWTDI (やり方は一つじゃない) です。特に正解はありません。でも、「これのほうがもっとかっこよく簡潔に書けるよ!」といった指摘は大歓迎です!
where FizzBuzz
-
where
を使うと引数に細かな制約を与えることができます
where-fizzbuzz.p6
proto sub fizzbuzz ($) { * }
multi sub fizzbuzz (Int $ where * %% 15) { "FuzzBuzz" }
multi sub fizzbuzz (Int $ where * %% 3) { "Fizz" }
multi sub fizzbuzz (Int $ where * %% 5) { "Buzz" }
multi sub fizzbuzz (Int $number) { $number }
fizzbuzz($_).say for 1..15;
補足
-
これはroastにもあります
-
where
について詳しく知りたい場合は次のページを参照してください:
subset FizzBuzz
-
subset
を使ってみるとよりPerl6ishなコードが書けます(※個人の感想です)
subset-fizzbuzz.p6
my subset Fizz of Int where * %% 3;
my subset Buzz of Int where * %% 5;
my subset FizzBuzz of Int where Fizz&Buzz;
my subset Number of Int where none Fizz|Buzz;
proto sub fizzbuzz ($) { * }
multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" }
multi sub fizzbuzz (Fizz) { "Fizz" }
multi sub fizzbuzz (Buzz) { "Buzz" }
multi sub fizzbuzz (Number $number) { $number }
fizzbuzz($_).say for 1..15;
補足
-
subset
について詳しく知りたい場合は次のページを参照してください:
NOTE
過去のサンプルコードについて、where all Fizz|Buzz
は間違いでした。すみません。
正しくは、where Fizz&Buzz
です。
- 下記のようなコマンドを実行すると違いがわかるかと思います:
$ perl6 -e 'say all 1|2'
all(any(1, 2))
$ perl6 -e 'say 1&2'
all(1, 2)
EVAL FizzBuzz
-
EVAL
を使ってFizzBuzzすることもできます。これは引数として与えた文字列をコードとして評価します。
EVAL-fizzbuzz.p6
use MONKEY-SEE-NO-EVAL;
proto sub fizzbuzz($) { * }
my Str $code-text = gather for 1..15 -> $number {
my $answer = do { $number %% 15 ?? "FizzBuzz"
!! $number %% 5 ?? "Buzz"
!! $number %% 3 ?? "Fizz"
!! $number
};
take " multi sub fizzbuzz($number) \{ \"$answer\" \}; "
}.join;
EVAL $code-text ~ 'fizzbuzz($_).say for 1..15;';
補足
-
EVAL
について詳しく知りたい場合は次のページを参照してください:
いろいろなパターンのFizzBuzzを考えてみると文法力がついて楽しくなってきますね!
以上、Perl 6アドベントカレンダーの17日目の投稿でした。