Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Gauche)generatorでFizzBuzz

毎度似たような FizzBuzzを書いていますが、gaucheでgeneratorを使ったバージョン。

無限リストを3本作ってマージするこの方式は、n f b を受け取った後、n をとるか f b をとるかの判定部分が泥臭くなります。
今回はパターンマッチを使って多少はすっきりしたかな~という感じです。

gauche特有の機能としては、^によるラムダ式構築と、#string-literal の文字列内変数展開を使っています。

(use gauche.generator)
(use util.match)

(define (circular n s)
  (apply circular-generator
         s (make-list (- n 1) "")))

(define (gfizzbuzz)
  (let1 g (gmap (^[n f b] (match `(,n ,f ,b)
                                 ((_ "" "") n)
                                 (else #"~|f|~b")))
                (giota)
                (circular 3 "Fizz")
                (circular 5 "Buzz"))
        (gdrop g 1)))


;; usage example
;; (generator->list (gfizzbuzz) 100)