Stream SICP 3.52延迟cdr

Stream SICP 3.52延迟cdr,stream,scheme,sicp,lazy-sequences,Stream,Scheme,Sicp,Lazy Sequences,, 第1步: ;1:==>(cons stream 1(stream map proc(stream cdr s))(假设流cdr仅在我们强制执行此流的cdr时进行评估) sum现在是1 第二步: 1不是偶数,因此它调用(流过滤器pred(流cdr-stream))。 这导致了 对cdr的求值,因此具体化了2,这是偶数,因此它应该调用:(cons-stream 2(stream-cdr-stream)) 根据这个答案应该是1+2=3,但它是6 为什么在调用当前的cdr之前,要将cdr的car物化

,

第1步:
;1:==>(cons stream 1(stream map proc(stream cdr s))
(假设
流cdr
仅在我们强制执行此流的
cdr
时进行评估)

sum
现在是1

第二步:
1
不是偶数,因此它调用
(流过滤器pred(流cdr-stream))
。 这导致了 对
cdr
的求值,因此具体化了
2
,这是偶数,因此它应该调用:
(cons-stream 2(stream-cdr-stream))

根据这个答案应该是1+2=3,但它是6

为什么在调用当前的
cdr
之前,要将
cdr
car
物化,有人能帮上忙吗?

使用

我们观察到:

> sum
0
> (define seq (stream-map accum (stream-enumerate-interval 1 20)))
> sum
1
> seq
(mcons 1 #<procedure:friedmans-tail.rkt:21:26>)
> (define y (stream-filter even? seq))
> sum
6
> seq
(mcons
 1
 (mcons
  3
  (mcons 6 #<procedure:friedmans-tail.rkt:21:26>)))
> y
(mcons 6 #<procedure:friedmans-tail.rkt:21:26>)
> 

在Racket中运行。要查看更多信息,请同时命名枚举序列:
(定义nums(流枚举间隔120))
(定义seq(流映射累积nums))
并在逐个尝试表达式时检查
nums
以及
seq
等。
#lang r5rs

(define-syntax cons-stream
  (syntax-rules () 
    ((_ h t) (cons h (lambda () t)))))

(define (stream-cdr s)
  (if (and (not (pair? (cdr s)))
           (not (null? (cdr s))))
      (set-cdr! s ((cdr s))))
  (cdr s))
> sum
0
> (define seq (stream-map accum (stream-enumerate-interval 1 20)))
> sum
1
> seq
(mcons 1 #<procedure:friedmans-tail.rkt:21:26>)
> (define y (stream-filter even? seq))
> sum
6
> seq
(mcons
 1
 (mcons
  3
  (mcons 6 #<procedure:friedmans-tail.rkt:21:26>)))
> y
(mcons 6 #<procedure:friedmans-tail.rkt:21:26>)
> 
1      = 1
1+2    = 3
1+2+3  = 6
...