练习3.52,
(define sum 0)
(define (accum x)
(set! sum (+ x sum))
sum)
;1: (define seq (stream-map accum (stream-enumerate-interval 1 20)))
;2: (define y (stream-filter even? seq))
;3: (define z (stream-filter (lambda (x) (= (remainder x 5) 0))
; seq))
;4: (stream-ref y 7)
;5: (display-stream z)
Step 1:
;1: ==> (cons-stream 1 (stream-map proc (stream-cdr s))
(认为stream-cdr
仅当我们强制时才评估cdr
该流的)
sum
现在是 1
Step 2:
1
is not even,因此(也已记忆,因此不再添加),它调用(stream-filter pred (stream-cdr stream))
。
这导致
评估cdr
从而具体化2
which is甚至,因此它应该调用:(cons-stream 2 (stream-cdr stream))
.
根据这个答案应该是 1+2 = 3 ,但它是 6
有人可以帮忙解释为什么吗cdr
's car
在当前之前实现cdr
叫做?
Using 丹尼尔·P·弗里德曼的记忆tail
#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>)
>
stream-filter?
需要获取它正在构造的流的第一个元素才能构造它。流的头元素已经被强制、计算,因此它必须已经存在。
在枚举区间 1 到 20 的累加和列表中,第一个偶数为 6:
1 = 1
1+2 = 3
1+2+3 = 6
...
在球拍中运行。
要查看更多信息,请同时命名枚举序列:(define nums (stream-enumerate-interval 1 20))
, (define seq (stream-map accum nums))
,并检查nums
也seq
等等,同时一一尝试表达方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)