Skip to content

Instantly share code, notes, and snippets.

@susisu
Created November 2, 2016 15:25
Show Gist options
  • Save susisu/c652442a8d70c8d1b3e3ccd43d3b2877 to your computer and use it in GitHub Desktop.
Save susisu/c652442a8d70c8d1b3e3ccd43d3b2877 to your computer and use it in GitHub Desktop.
generator
(define (generator func)
(define done #f)
(define res '())
(define return '())
(define next (lambda (val)
(func yield)
))
(define (yield val)
(if done
(error "generator already closed")
(call/cc (lambda (cont)
(set! next cont)
(return val)
))
)
)
(lambda (val)
(if done
res
(call/cc (lambda (cont)
(set! return cont)
(set! res (next val))
(set! done #t)
res
))
)
)
)
(define (gen-func yield)
(define x (yield 1))
(yield (* 2 x))
(yield 3)
4
)
(define gen (generator gen-func))
(print (gen '())) ; 1
(print (gen 100)) ; 200
(print (gen '())) ; 3
(print (gen '())) ; 4
(print (gen '())) ; 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment