关于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)))))
实际上我发现它并没有真正推迟。
当我执行时(定义范围-10到100(make-stream-enum-interval 10 100))。我希望在控制台中只能打印10个。虽然它是10 ..... 100
我的代码有什么问题吗? 或者,如果需要打印10 ... 100,那么我们可以说结构是 (缺点10(延迟 缺点11(延迟 缺点12(延迟 .... 100))) 如果是这样,那么我们需要更多的记忆?
答案 0 :(得分:8)
Scheme使用eager evaluation。这意味着在输入函数之前会计算函数调用的所有参数。因此,由于您的delay
是一个函数,因此首先会对传递给delay
的表达式进行求值。
要解决此问题,请将delay
设为宏,就像使用它的任何内容一样(例如cons-stream
)。以下是您的delay
和cons-stream
重新定义为宏:
(define-syntax delay
(syntax-rules ()
((_ exp) (lambda () exp))))
(define-syntax cons-stream
(syntax-rules ()
((_ a b) (cons a (delay b)))))