灯下 登录
计算机科学 / SICP / 3.5.1 Streams Are Delayed Lists

Exercise 3.52 · 习题

Exercise 3.52: Consider the sequence of
expressions

(define sum 0)

(define (accum x)
(set! sum (+ x sum))
sum)

(define seq
(stream-map
accum
(stream-enumerate-interval 1 20)))

(define y (stream-filter even? seq))

(define z
(stream-filter
(lambda (x)
(= (remainder x 5) 0)) seq))

(stream-ref y 7)
(display-stream z)

What is the value of sum after each of the above expressions is

evaluated? What is the printed response to evaluating the stream-ref

and display-stream expressions? Would these responses differ if we had

implemented (delay ⟨exp⟩) simply as (lambda () ⟨exp⟩)

without using the optimization provided by memo-proc? Explain.

练习 3.52:考虑以下表达式序列:

(define sum 0)

(define (accum x)
(set! sum (+ x sum))
sum)

(define seq
(stream-map
accum
(stream-enumerate-interval 1 20)))

(define y (stream-filter even? seq))

(define z
(stream-filter
(lambda (x)
(= (remainder x 5) 0)) seq))

(stream-ref y 7)
(display-stream z)

上述每个表达式求值后,sum 的值是多少?对 stream-ref 和 display-stream 表达式求值时,打印的响应是什么?如果我们将 (delay ⟨exp⟩) 简单地实现为 (lambda () ⟨exp⟩) 而不使用 memo-proc 提供的优化,这些响应会有所不同吗?请解释。

Racket #lang sicp
(define sum 0)

(define (accum x)
 (set! sum (+ x sum))
 sum)

(define seq
 (stream-map
 accum
 (stream-enumerate-interval 1 20)))

(define y (stream-filter even? seq))

(define z
 (stream-filter
 (lambda (x)
 (= (remainder x 5) 0)) seq))

(stream-ref y 7)
(display-stream z)