(define (fizz-buzz lst)
   (map
      (lambda (x)
         (cond
            ((= (modulo x 15) 0) "FizzBuzz")
            ((= (modulo x 5) 0) "Buzz")
            ((= (modulo x 3) 0) "Fizz")
            (else x)))
      lst))

(define (iota fst num . step_optional)
   (let ((step
            (cond
               ((null? step_optional) 1)
               ((and
                   (number? (car step_optional))
                   (null? (cdr step_optional)))
                  (car step_optional))
               (else (error "argument error")))))
      (let loop ((rest num)
                 (val '())
                 (elem (+ fst (* (- num 1) step))))
         (if (<= rest 0)
            val
            (loop (- rest 1) (cons elem val) (- elem step))))))

(for-each (lambda (x) (display x) (display #\linefeed))
   (fizz-buzz (iota 1 100)))
