Stream SICP 3.52延迟cdr
, 第1步: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:==>(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
...