(add-to-load-path (dirname (current-filename))) (import (srfi srfi-41) (extra-functional) (my-streams)) (define base (stream-from 1)) (define (f i j) (+ i j (* 2 i j))) (define-stream (i-stream i) (stream-map (part f i) (stream-from i))) (define ij-stream (stream-let loop ((n 1) (strm (i-stream 1))) (let* ((next (+ n 1)) (cutoff ((curry >) (stream-car (i-stream next)))) (available (stream-take-while cutoff strm)) (remaining (stream-drop-while cutoff strm))) (stream-append available (loop next (stream-merge remaining (i-stream next))))))) (define-stream (sieve input) (stream-map (compose (part + 1) (part * 2)) (stream-ordered-diff input ij-stream))) (define sundaram (stream-cons 2 (sieve base)))