diff options
Diffstat (limited to 'sieve')
-rw-r--r-- | sieve/euler.scm | 16 | ||||
-rw-r--r-- | sieve/sundaram.scm | 16 |
2 files changed, 18 insertions, 14 deletions
diff --git a/sieve/euler.scm b/sieve/euler.scm index b3ba946..ac23a94 100644 --- a/sieve/euler.scm +++ b/sieve/euler.scm @@ -16,17 +16,21 @@ -(define-stream (sub-merge x y) - (if (eq? (stream-car x) (stream-car y)) - (sub-merge (stream-cdr x) (stream-cdr y)) - (stream-cons (stream-car x) (sub-merge (stream-cdr x) y)))) +(define-stream (stream-ordered-diff xstrm ystrm) + (stream-match xstrm (() '()) ((x . xs) + (stream-match ystrm (() xstrm) ((y . ys) + (cond ((< x y) (stream-cons x (stream-ordered-diff xs ystrm))) + ((> x y) (stream-ordered-diff xstrm ys)) + (else (stream-ordered-diff xs ys)))))))) + (define-stream (sieve input) (stream-cons (stream-car input) - (sieve (sub-merge (stream-cdr input) - (stream-map ((curry *) (stream-car input)) input))))) + (sieve (stream-ordered-diff + (stream-cdr input) + (stream-map ((curry *) (stream-car input)) input))))) diff --git a/sieve/sundaram.scm b/sieve/sundaram.scm index 457efb8..384bc3d 100644 --- a/sieve/sundaram.scm +++ b/sieve/sundaram.scm @@ -19,9 +19,9 @@ (define-stream (stream-ordered-diff xstrm ystrm) (stream-match xstrm (() '()) ((x . xs) (stream-match ystrm (() xstrm) ((y . ys) - (if (eq? x y) - (stream-ordered-diff xs ys) - (stream-cons x (stream-ordered-diff xs ystrm)))))))) + (cond ((< x y) (stream-cons x (stream-ordered-diff xs ystrm))) + ((> x y) (stream-ordered-diff xstrm ys)) + (else (stream-ordered-diff xs ys)))))))) @@ -30,7 +30,7 @@ (stream-match ystrm (() xstrm) ((y . ys) (cond ((< x y) (stream-cons x (stream-merge xs ystrm))) ((> x y) (stream-cons y (stream-merge xstrm ys))) - ((eq? x y) (stream-cons x (stream-merge xs ys))))))))) + (else (stream-cons x (stream-merge xs ys))))))))) @@ -48,11 +48,11 @@ (define ij-stream (stream-let loop ((n 1) (strm (i-stream 1))) - (let* ((cutoff ((curry >) (stream-car (i-stream n)))) - (next (+ n 1)) + (let* ((next (+ n 1)) + (cutoff ((curry >) (stream-car (i-stream next)))) (available (stream-take-while cutoff strm)) - (remainder (stream-drop-while cutoff strm))) - (stream-append available (loop next (stream-merge remainder (i-stream next))))))) + (remaining (stream-drop-while cutoff strm))) + (stream-append available (loop next (stream-merge remaining (i-stream next))))))) |