fork download
  1. ; intersecting number wheels
  2.  
  3. (define-syntax define-generator
  4. (lambda (x)
  5. (syntax-case x (lambda)
  6. ((stx name (lambda formals e0 e1 ...))
  7. (with-syntax ((yield (datum->syntax (syntax stx) 'yield)))
  8. (syntax (define name
  9. (lambda formals
  10. (let ((resume #f) (return #f))
  11. (define yield
  12. (lambda args
  13. (call-with-current-continuation
  14. (lambda (cont)
  15. (set! resume cont)
  16. (apply return args)))))
  17. (lambda ()
  18. (call-with-current-continuation
  19. (lambda (cont)
  20. (set! return cont)
  21. (cond (resume (resume))
  22. (else (let () e0 e1 ...)
  23. (error 'name "unexpected return"))))))))))))
  24. ((stx (name . formals) e0 e1 ...)
  25. (syntax (stx name (lambda formals e0 e1 ...)))))))
  26.  
  27. (define (cycle xs)
  28. (define (last-pair xs)
  29. (if (null? (cdr xs)) xs
  30. (last-pair (cdr xs))))
  31. (set-cdr! (last-pair xs) xs) xs)
  32.  
  33. (define (take-gen n gen)
  34. (let loop ((n n) (gs (list)))
  35. (if (zero? n) (reverse gs)
  36. (loop (- n 1) (cons (gen) gs)))))
  37.  
  38. (define-generator (wheel xs)
  39. (let loop ((ws (cycle xs)))
  40. (if (integer? (car ws))
  41. (yield (car ws))
  42. (yield ((eval (car ws)))))
  43. (loop (cdr ws))))
  44.  
  45. (define a (wheel '(1 2 3)))
  46. (display (take-gen 20 a)) (newline)
  47.  
  48. (define a (wheel '(1 b 2)))
  49. (define b (wheel '(3 4)))
  50. (display (take-gen 20 a)) (newline)
  51.  
  52. (define a (wheel '(1 d d)))
  53. (define d (wheel '(6 7 8)))
  54. (display (take-gen 20 a)) (newline)
  55.  
  56. (define a (wheel '(1 b c)))
  57. (define b (wheel '(3 4)))
  58. (define c (wheel '(5 b)))
  59. (display (take-gen 20 a)) (newline)
Runtime error #stdin #stdout #stderr 0s 7716KB
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 (...
	<syntax>	  (lambda)	<--