2010年1月23日土曜日

Common Lisp でFizzBuzz

今更ながらFizzBuzzでも無いんですが、上記リンクで極短のRubyでのコードが紹介されていたんで、構造をCommon Lispでエミュレートしてみました。

(loop for i from 1 to 30
do (format t "~A~%"
(let ((s (concatenate
'string
(nth (mod i 3)
'("Fizz"))
(nth (mod i 5)
'("Buzz")))))
(if (zerop (length s))
i
s))))

ただ、正直な感想を言えば、ある意味これは文字通りハックだな、と思いました。
そもそも、配列(あるいはリスト)の要素数を越えたトコでアクセサが作用するとnilが返る、と言う仕様じゃないと書き得ないコードです。
Schemeなんかではエラー扱いになりますが、Cだったらどうなるでしょうね。考え出すと恐ろしくて夜も眠れません。
ある意味、Rubyの仕様が良く分かってる、と言う意味では素晴らしいとは思いましたが、同時に普遍的に使えるテクニックではない辺りが残念ではあります。

0 件のコメント:

コメントを投稿