关于SICP 3.5
我自己的实现如下
(define (delay exp) (lambda () exp))
(define (force delayed-obj)
(delayed-obj))
(define (cons-stream a b) (cons a (delay b)))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (take n stream)
(if (= n 0)
(print "0")
(begin (take (- n 1) (stream-cdr stream))
(print n))))
(define (make-stream-enum-interval low high)
(if (> low high)
'()
(begin (print low) (cons-stream low (make-stream-enum-interval (+ low 1) high)))))实际上,我发现它并没有真正延迟。当我执行(定义range- 10 -to-100 (make-stream-enum-interval 10 100))时。我希望在控制台中只打印出10个。而现在是10...100
我的代码有什么问题吗?或者,如果需要打印10...100,那么我们可以说结构是(cons 10 (delay cons 11 (delay cons 12 (delay ....100)如果是这样,那么我们需要更多的内存?
发布于 2014-07-02 19:09:10
方案使用eager evaluation。这意味着函数调用的所有参数在进入函数之前都要进行计算。因此,由于您的delay是一个函数,传递给delay的表达式将首先计算。
要解决这个问题,就像使用它的任何东西(如cons-stream)一样,将delay设为宏。下面是将delay和cons-stream重新定义为宏的方法:
(define-syntax delay
(syntax-rules ()
((_ exp) (lambda () exp))))
(define-syntax cons-stream
(syntax-rules ()
((_ a b) (cons a (delay b)))))https://stackoverflow.com/questions/24529271
复制相似问题