(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)