3

关于 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

我的代码有什么问题吗?或者,如果 print 10...100 是必要的,那么我们可以说结构是 (cons 10 (delay cons 11 (delay cons 12 (delay ....100))) 如果是这样,那么我们需要更多的内存吗?

4

1 回答 1

9

方案使用热切评估。这意味着函数调用的所有参数都在输入函数之前进行评估。因此,由于 yourdelay是一个函数,因此传递的表达式delay首先被评估。

要解决这个问题,请制作delay一个宏,就像使用它的任何东西一样(如cons-stream)。delay这是您的和cons-streamas 宏的重新表述:

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

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))
于 2014-07-02T11:09:09.810 回答