SICP cons-stream

时间:2014-07-02 10:52:07

标签: scheme sicp cons

关于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))) 如果是这样,那么我们需要更多的记忆?

1 个答案:

答案 0 :(得分:8)

Scheme使用eager evaluation。这意味着在输入函数之前会计算函数调用的所有参数。因此,由于您的delay是一个函数,因此首先会对传递给delay的表达式进行求值。

要解决此问题,请将delay设为宏,就像使用它的任何内容一样(例如cons-stream)。以下是您的delaycons-stream重新定义为宏:

(define-syntax delay
  (syntax-rules ()
    ((_ exp) (lambda () exp))))

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))