Fizz-Buzz問題(Scheme版)

巷で「Fizz-Buzz問題」が流行っているみたいなので、私も解いてみました。
ただし、3分以上かかってしまいましたが...。

(define (fizz-buzz)
  (letrec ((loop (lambda (n result)
		   (if (< n 1)
		       result
		       (cond ((= (remainder n 15) 0)
			      (loop (- n 1) (cons "FizzBuzz" result)))
			     ((= (remainder n 3) 0)
			      (loop (- n 1) (cons "Fizz" result)))
			     ((= (remainder n 5) 0)
			      (loop (- n 1) (cons "Buzz" result)))
			     (else
			      (loop (- n 1) (cons (number->string n) result))))))))
    (loop 100 '())))

(define (main args)
  (display (string-join (fizz-buzz)))
  (display "\n"))