Scheme SICP cons流

Scheme SICP cons流,scheme,sicp,cons,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))) (def

关于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(使流枚举间隔10-100))。我希望控制台中只打印10个。而现在是10…100

我的代码有什么问题吗? 或者,如果打印10…100是必要的,那么我们可以说结构是 (c)第10条(延迟) 第11条(延迟) cons 12(延期) ....100))) 如果是这样,那么我们需要更多的内存。

方案使用。这意味着函数调用的所有参数都在函数输入之前进行求值。因此,由于您的
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)))))

您还可以使用lips宏
(定义宏(delay.exp)`(lambda(),@exp))