Scalaでパーサーを作ってみる〜13:FizzBuzz!

Scalaの勉強をはじめたので、とりあえず簡単なパーサーを作ってみてます。
http://d.hatena.ne.jp/nowokay/20111109#1320815540


前回、関数呼出しのチェーンができるようにしました。
http://d.hatena.ne.jp/nowokay/20111117#1321499255


ここらで、ちょっと、プログラマの実力をはかる試金石という噂のFizzBuzzを書いて、ぼくもScalaプログラマへの道に足を踏み入れましたよってことを認めてもらわねばなりません。
FizzBuzzは、「1からnまでの数字を出力、ただし3で割り切れるときはfizz、5で割り切れるときはbuzz、3と5の両方で割り切れるときはfizzbuzzを数字の代わりに出力」という問題です。


まず、FizzBuzzでは割り算の余りの計算が必要になるのですが、今回剰余演算子が使えません。
ということで、mod関数を書いてみます。

def mod(x, y) ={
    if(x < y){
      x
    }else{
      mod(x - y, y)
    }
};


そうするとFizzBuzzが次のように書けます

def fizzbuzz(x) ={
    def impl(y)={
      if(y < x + 1){
        if(mod(y,3) < 1){
          if(mod(y,5) < 1){
            println("fizzbuzz")
          }else{
            println("fizz")
          }
        }else if(mod(y,5)< 1){
          println("buzz")
        }else{
          println(y)
        };
        impl(y + 1)
      }else{
        0
      }
    };
    impl(1)
};
fizzbuzz(20);


実行してみるとこういう感じで、ちゃんとFizzBuzzしてます!

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz


わーい、ぼくにもScalaFizzBuzzが(動く言語が)書けました!


ソースはこれ。
https://gist.github.com/1345875/3d29cd7b78c6b6d359b5607568e48653e5a8757c