Lisp で FizzBuzz

あえて Common Lisp の do マクロを避けて、自分で defmacro してみる。ちょっとしたリハビリ。つうかまだひっ ぱるのか。
Emacs Lisp で書いたけど、Common Lisp でもそのまま動くだろう。たぶん。

(defmacro from-to (var from to &rest body)
  `(let ((,var ,from))
     (while (<= ,var ,to)
       (progn
         ,@body
         (setq ,var (1+ ,var))))))
       
(defun fizzbuzz ()
  (from-to i 1 100
           (let ((mul3p (zerop (mod i 3)))
                 (mul5p (zerop (mod i 5))))
             (cond
              ((and mul3p mul5p)
               (print "FizzBuzz"))
              (mul3p
               (print "Fizz"))
              (mul5p
               (print "Buzz"))
              (t
               (print i))))))