At 22:49 Uhr +0100 30.10.2005, I wrote:
While playing with streams, I think I've noticed that the stream "head" is not garbage collected while traversing the stream even if it is not referenced by user data structures anymore.
Sorry, please accept my apology. I was completely blind to the fact that the bignums in the stream (and also in the output list from stream-take) were huge, and so the conclusion that "the output list from take only needs about 600000 bytes" (as measured by (time (list-copy t))) is of course wrong. With (declare (fixnum)(not safe)) the "issue" is gone. Also using stream-ref (see below) instead of stream-take, Gambit clearly is showing to be deallocating the stream head. (The other observation, that Gambit is seemingly increasingly filling up memory after *repeated* runs with bignums and large n's in the example of my last mail, might still be an issue, but I would have to experiment more to be sure.)
Thanks for this nice scheme system Christian.
;; -- 8< --- (the mentioned stream-ref function: )
(define (stream-drop strm k) (if (and (##fixnum? k) (##fixnum.>= k 0)) (let iter ((strm strm) (k k)) (if (##fixnum.zero? k) strm (let ((p (stream-force strm))) (if (##pair? p) (iter (##cdr p) (##fixnum.- k 1)) (error "stream-drop: stream too short"))))) (error "stream-drop: k is not a positive fixnum:" k)))
(define (stream-ref strm i) (stream-car (stream-drop strm i)))
;; test with: (time (stream-ref (fib-stream) 350000)) ;; (takes a long time, but does not take up memory)