プログラミング課題としてよく取り上げられるFizzBuzzをSchemeで書いてやろうという意欲がわいたので書いてみました。
巷にはFizzBuzzを最短実装してやろうという向きがあるようなので、せっかくだし(Gaucheの独自実装を使うか悩んだ)書いてみました。
前座はさておき、こんなコードです。nを渡すと結果を返すlambda形式です。
(lambda (n) (case (list-ref '#0=(Z N N F N B F N N F B N F N N . #0#) n) ('N n) ('F 'Fizz) ('B 'Buzz) ('Z 'FizzBuzz)))
枠の都合で改行を入れていますが改行を抜いて正味119文字。なかなかの傑作ですね(自画自賛)。
循環リストから取り出すのでmoduloは使いませんでした。
FizzBuzzの結果は15でループする(eqv? (* 3 5) 15)ので結果リストを先に用意してしまうという手法をとりました。
結果リストにFizz, Buzz, とつらつら書くと微妙にコードが伸びる(ような気がした)ので後から分岐で結果を書き換えています。
どちらにせよnがFizzにもBuzzにも属しない場合はnを返却しないといけないので同じようなものかなと思います。
またGauche実装を使えば"(lambda (n)..."のくだりは"(^n...)に短縮できます。
LISP語族はどうしてもカッコとコッカが必要になるので文字数のオーバーヘッドが増加する。
仕方ないね!
よくある様式どおりに、"1 2 Fizz 4 Buzz..."が欲しい場合はmapを使いましょう。