LISPでFizzBuzz

ふと FizzBuzz を LISP 的に書くとどうなるんだろうと思って調べてみた。 ループで書くのは LISP 的にはダサいはず(適当)なので末尾再帰とかだろうかと 思っていたら,1 から 100 までのリストを作って map していくという感じらしい。 ほんまか?

(letrec ((print-all
          (lambda (l)
            (when (pair? l)
                (print (car l))
                (print-all (cdr l))))))
  (print-all
   (map
    (lambda (n)
      (cond ((= (remainder n 15) 0) "FizzBuzz")
            ((= (remainder n 3) 0) "Fizz")
            ((= (remainder n 5) 0) "Buzz")
            (else (number->string n))))
    (iota 100 1))))

てことで Scheme で書いてみた。一応手元の環境の Gauche 0.9.9 では動いた。

出力する部分のせいでかなりごちゃごちゃになったが,FizzBuzz のリストを作ること自体は 簡単にできる(僕は LISP はまともに書けないのでこのコードは LISP の人から見ると一笑に付す ようなものだろうが)。

しかしなんというかメモリが潤沢な前提の贅沢な考え方だなぁ……。