fork download
  1. ; van eck sequence
  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 (take-gen n gen)
  28. (let loop ((n n) (gs (list)))
  29. (if (zero? n) (reverse gs)
  30. (loop (- n 1) (cons (gen) gs)))))
  31.  
  32. (define-generator (van-eck)
  33. (let loop ((v 0) (i 0) (prev (list)))
  34. (yield v)
  35. (let ((t v))
  36. (let ((v (- i (cond ((assoc v prev) => cdr) (else i)))))
  37. (loop v (+ i 1) (cons (cons t i) prev))))))
  38.  
  39. (display (take-gen 25 (van-eck)))
Success #stdin #stdout 0.02s 51096KB
stdin
Standard input is empty
stdout
(0 0 1 0 2 0 2 2 1 6 0 5 0 2 6 5 4 0 5 3 0 3 2 9 0)