; every possible fraction
(define-syntax define-generator
(lambda (x)
(syntax-case x (lambda)
((stx name (lambda formals e0 e1 ...))
(with-syntax ((yield (datum->syntax-object (syntax stx) 'yield)))
(syntax (define name
(lambda formals
(let ((resume #f) (return #f))
(define yield
(lambda args
(call-with-current-continuation
(lambda (cont)
(set! resume cont)
(apply return args)))))
(lambda ()
(call-with-current-continuation
(lambda (cont)
(set! return cont)
(cond (resume (resume))
(else (let () e0 e1 ...)
(error 'name "unexpected return"))))))))))))
((stx (name . formals) e0 e1 ...)
(syntax (stx name (lambda formals e0 e1 ...)))))))
(define-generator (rats)
(let loop ((x 1))
(yield x)
(let* ((n (floor x)) (y (- x n)))
(loop (/ (- n -1 y))))))
(define next (rats))
(do ((i 1 (+ i 1))) ((< 1200 i))
(display (next))
(if (zero? (modulo i 12))
(newline)
(display #\tab)))