How is the sicp cons-stream implemented?
scheme, sicp
Solution
`cons-stream` needs to be a macro in order for your sample code to work correctly. Otherwise the invocation of `cons-stream` will evaluate all its arguments eagerly.
Try this (not tested):
(define-syntax cons-stream
(syntax-rules ()
((cons-stream a b)
(cons a (memo-func (lambda () b))))))
P.S. Your `delay` needs to be a macro also, for similar reasons. Then after you fix `delay`, you can make your `cons-stream` use `delay` directly.
Problem
I'm working through the streams section of the scip and am stuck on how to define a stream. The following is my code: ``` (define (memo-func function) (let ((already-run? false) (result false)) (lambda () (if (not already-run?) (begin (set! result (function)) (set! already-run? true) result) result)))) (define (delay exp) (memo-func (lambda () exp))) (define (force function) (function)) (define the-empty-stream '()) (define (stream-null? stream) (null? stream)) (define (stream-car stream) (car stream)) (define (stream-cdr stream) (force (cdr stream))) (define (cons-stream a b) (cons a (memo-func (lambda () b)))) ``` If I define integers the way that the book descibes: ``` (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) ``` I get a message saying: Aborting!: maximum recursion depth exceeded. I'm guessing that the delay function is not working but I don't know how to fix it. I am running the MIT scheme on my Mac. update 1 So now with cons-stream as a macro, the integers can be defined. But then I've got another error. ``` (define (stream-take n s) (cond ((or (stream-null? s) (= n 0)) the-empty-stream) (else (cons-stream (stream-car s) (stream-take (- n 1) (stream-cdr s)))))) (stream-take 10 integers) ;ERROR - Variable reference to a syntactic keyword: cons-stream ``` update 2 Please ignore update 1 above