; van eck sequence
(define-syntax define-generator
(lambda (x)
(syntax-case x (lambda)
((stx name (lambda formals e0 e1 ...))
(with-syntax ((yield (datum->syntax (syntax stx) 'yield)))
(syntax (define name
(lambda formals
(let ((resume #f) (return #f))
(define yield
(lambda args
(call-with-current-continuation
(lambda (cont)
(set! resume cont)
(apply return args)))))
(lambda ()
(call-with-current-continuation
(lambda (cont)
(set! return cont)
(cond (resume (resume))
(else (let () e0 e1 ...)
(error 'name "unexpected return"))))))))))))
((stx (name . formals) e0 e1 ...)
(syntax (stx name (lambda formals e0 e1 ...)))))))
(define (take-gen n gen)
(let loop ((n n) (gs (list)))
(if (zero? n) (reverse gs)
(loop (- n 1) (cons (gen) gs)))))
(define-generator (van-eck)
(let loop ((v 0) (i 0) (prev (list)))
(yield v)
(let ((t v))
(let ((v (- i (cond ((assoc v prev) => cdr) (else i)))))
(loop v (+ i 1) (cons (cons t i) prev))))))
(display (take-gen 25 (van-eck)))
OyB2YW4gZWNrIHNlcXVlbmNlCgooZGVmaW5lLXN5bnRheCBkZWZpbmUtZ2VuZXJhdG9yCiAgKGxhbWJkYSAoeCkKICAgIChzeW50YXgtY2FzZSB4IChsYW1iZGEpCiAgICAgICgoc3R4IG5hbWUgKGxhbWJkYSBmb3JtYWxzIGUwIGUxIC4uLikpCiAgICAgICAgICh3aXRoLXN5bnRheCAoKHlpZWxkIChkYXR1bS0+c3ludGF4IChzeW50YXggc3R4KSAneWllbGQpKSkKICAgICAgICAgICAoc3ludGF4IChkZWZpbmUgbmFtZQogICAgICAgICAgICAgKGxhbWJkYSBmb3JtYWxzCiAgICAgICAgICAgICAgIChsZXQgKChyZXN1bWUgI2YpIChyZXR1cm4gI2YpKQogICAgICAgICAgICAgICAgIChkZWZpbmUgeWllbGQKICAgICAgICAgICAgICAgICAgIChsYW1iZGEgYXJncwogICAgICAgICAgICAgICAgICAgICAoY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChjb250KQogICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISByZXN1bWUgY29udCkKICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5IHJldHVybiBhcmdzKSkpKSkKICAgICAgICAgICAgICAgICAobGFtYmRhICgpCiAgICAgICAgICAgICAgICAgICAoY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uCiAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoY29udCkKICAgICAgICAgICAgICAgICAgICAgIChzZXQhIHJldHVybiBjb250KQogICAgICAgICAgICAgICAgICAgICAgKGNvbmQgKHJlc3VtZSAocmVzdW1lKSkKICAgICAgICAgICAgICAgICAgICAgIChlbHNlIChsZXQgKCkgZTAgZTEgLi4uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yICduYW1lICJ1bmV4cGVjdGVkIHJldHVybiIpKSkpKSkpKSkpKSkKICAgICAgICAoKHN0eCAobmFtZSAuIGZvcm1hbHMpIGUwIGUxIC4uLikKICAgICAgICAgIChzeW50YXggKHN0eCBuYW1lIChsYW1iZGEgZm9ybWFscyBlMCBlMSAuLi4pKSkpKSkpCgooZGVmaW5lICh0YWtlLWdlbiBuIGdlbikKICAobGV0IGxvb3AgKChuIG4pIChncyAobGlzdCkpKQogICAgKGlmICh6ZXJvPyBuKSAocmV2ZXJzZSBncykKICAgICAgKGxvb3AgKC0gbiAxKSAoY29ucyAoZ2VuKSBncykpKSkpCgooZGVmaW5lLWdlbmVyYXRvciAodmFuLWVjaykKICAobGV0IGxvb3AgKCh2IDApIChpIDApIChwcmV2IChsaXN0KSkpCiAgICAoeWllbGQgdikKICAgIChsZXQgKCh0IHYpKQogICAgICAobGV0ICgodiAoLSBpIChjb25kICgoYXNzb2MgdiBwcmV2KSA9PiBjZHIpIChlbHNlIGkpKSkpKQogICAgICAgIChsb29wIHYgKCsgaSAxKSAoY29ucyAoY29ucyB0IGkpIHByZXYpKSkpKSkKCihkaXNwbGF5ICh0YWtlLWdlbiAyNSAodmFuLWVjaykpKQ==