Blob


1 (define (memo-proc proc)
2 (let ((already-run? false) (result false))
3 (lambda ()
4 (if already-run?
5 result
6 (begin (set! already-run? true)
7 (set! result (proc))
8 result)))))
10 (define-syntax mydelay
11 (rsc-macro-transformer
12 (let ((xfmr
13 (lambda (exp)
14 `(memo-proc (lambda () ,exp)))))
15 (lambda (e r)
16 (apply xfmr (cdr e))))))
18 (define (myforce delayed-object)
19 (delayed-object))
21 (define-syntax cons-stream
22 (rsc-macro-transformer
23 (let ((xfmr (lambda (x y) `(cons ,x (mydelay ,y)))))
24 (lambda (e r)
25 (apply xfmr (cdr e))))))
27 (define (stream-car s)
28 (car s))
29 (define (stream-cdr s)
30 (myforce (cdr s)))
31 (define stream-null? null?)
32 (define the-empty-stream '())
34 (define (integers-starting-from n)
35 (cons-stream n (integers-starting-from (+ n 1))))
37 (define (stream-ref s n)
38 (if (= n 0)
39 (stream-car s)
40 (stream-ref (stream-cdr s) (- n 1))))
41 (define (stream-map proc s)
42 (if (stream-null? s)
43 the-empty-stream
44 (cons-stream (proc (stream-car s))
45 (stream-map proc (stream-cdr s)))))
46 (define (stream-for-each proc s)
47 (if (stream-null? s)
48 'done
49 (begin (proc (stream-car s))
50 (stream-for-each proc (stream-cdr s)))))
52 (define (stream-enumerate-interval low high)
53 (if (> low high)
54 the-empty-stream
55 (cons-stream
56 low
57 (stream-enumerate-interval (+ low 1) high))))
59 (define (display-stream s)
60 (stream-for-each display-line s))
61 (define (display-line x)
62 (newline)
63 (display x))
65 (define (test-case actual expected)
66 (newline)
67 (display "Actual: ")
68 (display actual)
69 (newline)
70 (display "Expected: ")
71 (display expected)
72 (newline))
74 ;; Exercise 3.51. In order to take a closer look at delayed evaluation, we will use the following procedure, which simply returns its argument after printing it:
76 (define (show x)
77 (display-line x)
78 x)
80 ;; What does the interpreter print in response to evaluating each expression in the following sequence?59
82 (define x (stream-map show (stream-enumerate-interval 0 10)))
83 ;; 0
84 (newline)
85 (stream-ref x 5)
86 ;; 1->5
87 (newline)
88 (stream-ref x 7)
89 ;; 6->7