ベタに書けばこんな感じか。
(defun fizz-buzz-normal (num) (format t "~a~%" (cond ((zerop (mod num 15)) "FizzBuzz") ((zerop (mod num 3)) "Fizz") ((zerop (mod num 5)) "Buzz") (t num))))
with-output-to-string を使うとよりエレガント、かも知れない。
(defun fizz-buzz (num) (let ((r (with-output-to-string (s) (when (zerop (mod num 3)) (format s "Fizz")) (when (zerop (mod num 5)) (format s "Buzz"))))) (format t "~a~%" (if (string= "" r) num r))))
一般化バージョン。
(defun gen-fizz-buzz (rules) (lambda (num) (let ((r (with-output-to-string (s) (loop for (b w) in rules do (when (zerop (mod num b)) (format s "~a" w)))))) (format t "~a~%" (if (string= "" r) num r)))))
実行。
(loop for n from 1 to 100 do (fizz-buzz n)) ;; 3,5,7の倍数の時、それぞれFizz,Buzz,Kozz (let ((fizz-buzz-kozz (gen-fizz-buzz '((3 "Fizz") (5 "Buzz") (7 "Kozz"))))) (loop for n from 1 to 100 do (funcall fizz-buzz-kozz n)))