fork(1) download
  1. (define-syntax define-generator
  2. (lambda (x)
  3. (syntax-case x (lambda)
  4. ((stx name (lambda formals e0 e1 ...))
  5. (with-syntax ((yield (datum->syntax-object (syntax stx) 'yield)))
  6. (syntax (define name
  7. (lambda formals
  8. (let ((resume #f) (return #f))
  9. (define yield
  10. (lambda args
  11. (call-with-current-continuation
  12. (lambda (cont)
  13. (set! resume cont)
  14. (apply return args)))))
  15. (lambda ()
  16. (call-with-current-continuation
  17. (lambda (cont)
  18. (set! return cont)
  19. (cond (resume (resume))
  20. (else (let () e0 e1 ...)
  21. (error 'name "unexpected return"))))))))))))
  22. ((stx (name . formals) e0 e1 ...)
  23. (syntax (stx name (lambda formals e0 e1 ...)))))))
  24.  
  25. (define-generator (test-gen)
  26. (yield 1)
  27. (yield 2)
  28. (yield 3))
  29.  
  30. (define t (test-gen))
  31. (display (t)) (newline)
  32. (display (t)) (newline)
  33. (display (t)) (newline)
  34. (display (t)) (newline)
Runtime error #stdin #stdout #stderr 0s 7276KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: during expansion of (lambda ...) - in `lambda' - pair expected: (lambda)

	Call history:

	<syntax>	  (define-syntax define-generator (lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1...
	<syntax>	  (##core#define-syntax define-generator (lambda (x) (syntax-case x (lambda) ((stx name (lambda formal......
	<syntax>	  (lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (dat......
	<syntax>	  (##core#lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yie......
	<syntax>	  (##core#begin (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (d......
	<syntax>	  (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (datum->syntax-o......
	<syntax>	  (lambda)	<--