Don't blow out the stack in STREAM->LIST.
authorJoe Marshall <jmarshall@alum.mit.edu>
Sat, 16 Jan 2016 23:53:58 +0000 (15:53 -0800)
committerJoe Marshall <jmarshall@alum.mit.edu>
Sat, 16 Jan 2016 23:53:58 +0000 (15:53 -0800)
src/runtime/stream.scm

index 6c49ebc356382c8e0dfe5072b0e484438e006b6e..e0a0e306e13598d72ff98e91043ea482c75a12bd 100644 (file)
@@ -265,13 +265,11 @@ USA.
        '())))
 
 (define (stream->list stream)
-  (if (stream-pair? stream)
-      (cons (car stream)
-           (stream->list (force (cdr stream))))
-      (begin
-       (if (not (null? stream))
-           (error:illegal-stream-element stream 'STREAM->LIST 0))
-       '())))
+  (let loop ((s stream)
+            (elements '()))
+    (cond ((stream-pair? tail) (loop (tail s) (cons (head s) elements)))
+         ((null? s) (reverse elements))
+         (else (error:illegal-stream-element stream 'STREAM->LIST 0)))))
 \f
 (define prime-numbers-stream)