I'm trying to implement generators in racket using call/cc, I have this code so far
(define (foo2)
(define (g abort)
(define-syntax-rule
(yield x)
(call/cc (lambda (k)
(set! g k)
(abort x))))
(yield 'foo)
(yield 'bar)
(yield 'tar)
(abort 'end))
(thunk (call/cc g)))
If I play with this in the REPL it seems to be working correctly
foo.rkt> (define g (foo2))
foo.rkt> (g)
'foo
foo.rkt> (g)
'bar
foo.rkt> (g)
'tar
foo.rkt> (g)
'end
foo.rkt> (g)
'end
foo.rkt>
But if I try to call g inside a list, it hangs and I have no idea what is happening
foo.rkt> (define g (foo2))
foo.rkt> (list (g) (g) (g))
;; prompt is not released
What is going on? Where my generator implementation is wrong?