PasteRack.org
Paste # 71889
2017-12-10 22:03:07

Fork as a new paste.

Paste viewed 53 times.


Embed:

  1. #lang racket
  2. (require racket/control)
  3.  
  4. (define-syntax generator
  5.   (syntax-rules ()
  6.     [(_ body ...)
  7.      (let ((k (lambda () body ...)))
  8.        (lambda m
  9.          (let-values (((a k^) (reset (apply k m))))
  10.            (set! k k^)
  11.            a)))]))
  12.  
  13. (define (yield m) (shift0 k (values m k)))
  14.  
  15. (define (nats)
  16.   (generator
  17.    (let loop ((i 1))
  18.      (yield i)
  19.      (loop (add1 i)))))
  20.  
  21. (define t1 (nats))
  22. (t1)
  23. (t1)
  24. (t1)
  25. (t1)
  26. (t1)

=>

1

2

3

4

5