(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 (test-gen)
(yield 1)
(yield 2)
(yield 3))
(define t (test-gen))
(display (t)) (newline)
(display (t)) (newline)
(display (t)) (newline)
(display (t)) (newline)
KGRlZmluZS1zeW50YXggZGVmaW5lLWdlbmVyYXRvcgogIChsYW1iZGEgKHgpCiAgICAoc3ludGF4LWNhc2UgeCAobGFtYmRhKQogICAgICAoKHN0eCBuYW1lIChsYW1iZGEgZm9ybWFscyBlMCBlMSAuLi4pKQogICAgICAgICAod2l0aC1zeW50YXggKCh5aWVsZCAoZGF0dW0tPnN5bnRheC1vYmplY3QgKHN5bnRheCBzdHgpICd5aWVsZCkpKQogICAgICAgICAgIChzeW50YXggKGRlZmluZSBuYW1lCiAgICAgICAgICAgICAobGFtYmRhIGZvcm1hbHMKICAgICAgICAgICAgICAgKGxldCAoKHJlc3VtZSAjZikgKHJldHVybiAjZikpCiAgICAgICAgICAgICAgICAgKGRlZmluZSB5aWVsZAogICAgICAgICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAgICAgICAgIChjYWxsLXdpdGgtY3VycmVudC1jb250aW51YXRpb24KICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGNvbnQpCiAgICAgICAgICAgICAgICAgICAgICAgIChzZXQhIHJlc3VtZSBjb250KQogICAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgcmV0dXJuIGFyZ3MpKSkpKQogICAgICAgICAgICAgICAgIChsYW1iZGEgKCkKICAgICAgICAgICAgICAgICAgIChjYWxsLXdpdGgtY3VycmVudC1jb250aW51YXRpb24KICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChjb250KQogICAgICAgICAgICAgICAgICAgICAgKHNldCEgcmV0dXJuIGNvbnQpCiAgICAgICAgICAgICAgICAgICAgICAoY29uZCAocmVzdW1lIChyZXN1bWUpKQogICAgICAgICAgICAgICAgICAgICAgKGVsc2UgKGxldCAoKSBlMCBlMSAuLi4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IgJ25hbWUgInVuZXhwZWN0ZWQgcmV0dXJuIikpKSkpKSkpKSkpKQogICAgICAgICgoc3R4IChuYW1lIC4gZm9ybWFscykgZTAgZTEgLi4uKQogICAgICAgICAgKHN5bnRheCAoc3R4IG5hbWUgKGxhbWJkYSBmb3JtYWxzIGUwIGUxIC4uLikpKSkpKSkKCihkZWZpbmUtZ2VuZXJhdG9yICh0ZXN0LWdlbikKICAoeWllbGQgMSkKICAoeWllbGQgMikKICAoeWllbGQgMykpCgooZGVmaW5lIHQgKHRlc3QtZ2VuKSkKKGRpc3BsYXkgKHQpKSAobmV3bGluZSkKKGRpc3BsYXkgKHQpKSAobmV3bGluZSkKKGRpc3BsYXkgKHQpKSAobmV3bGluZSkKKGRpc3BsYXkgKHQpKSAobmV3bGluZSk=