0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl 6Advent Calendar 2016

Day 17

FizzBuzz with Perl 6

Last updated at Posted at 2016-12-16

こんにちは、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;

補足

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;

補足

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;';

補足

いろいろなパターンのFizzBuzzを考えてみると文法力がついて楽しくなってきますね!
以上、Perl 6アドベントカレンダーの17日目の投稿でした。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?