Blame


1 665c255d 2023-08-04 jrmu (define (memo-proc proc)
2 665c255d 2023-08-04 jrmu (let ((already-run? false) (result false))
3 665c255d 2023-08-04 jrmu (lambda ()
4 665c255d 2023-08-04 jrmu (if already-run?
5 665c255d 2023-08-04 jrmu result
6 665c255d 2023-08-04 jrmu (begin (set! already-run? true)
7 665c255d 2023-08-04 jrmu (set! result (proc))
8 665c255d 2023-08-04 jrmu result)))))
9 665c255d 2023-08-04 jrmu
10 665c255d 2023-08-04 jrmu (define-syntax mydelay
11 665c255d 2023-08-04 jrmu (rsc-macro-transformer
12 665c255d 2023-08-04 jrmu (let ((xfmr
13 665c255d 2023-08-04 jrmu (lambda (exp)
14 665c255d 2023-08-04 jrmu `(memo-proc (lambda () ,exp)))))
15 665c255d 2023-08-04 jrmu (lambda (e r)
16 665c255d 2023-08-04 jrmu (apply xfmr (cdr e))))))
17 665c255d 2023-08-04 jrmu
18 665c255d 2023-08-04 jrmu (define (myforce delayed-object)
19 665c255d 2023-08-04 jrmu (delayed-object))
20 665c255d 2023-08-04 jrmu
21 665c255d 2023-08-04 jrmu (define-syntax cons-stream
22 665c255d 2023-08-04 jrmu (rsc-macro-transformer
23 665c255d 2023-08-04 jrmu (let ((xfmr (lambda (x y) `(cons ,x (mydelay ,y)))))
24 665c255d 2023-08-04 jrmu (lambda (e r)
25 665c255d 2023-08-04 jrmu (apply xfmr (cdr e))))))
26 665c255d 2023-08-04 jrmu
27 665c255d 2023-08-04 jrmu (define (stream-car s)
28 665c255d 2023-08-04 jrmu (car s))
29 665c255d 2023-08-04 jrmu (define (stream-cdr s)
30 665c255d 2023-08-04 jrmu (myforce (cdr s)))
31 665c255d 2023-08-04 jrmu (define stream-null? null?)
32 665c255d 2023-08-04 jrmu (define the-empty-stream '())
33 665c255d 2023-08-04 jrmu
34 665c255d 2023-08-04 jrmu (define (integers-starting-from n)
35 665c255d 2023-08-04 jrmu (cons-stream n (integers-starting-from (+ n 1))))
36 665c255d 2023-08-04 jrmu
37 665c255d 2023-08-04 jrmu (define (stream-ref s n)
38 665c255d 2023-08-04 jrmu (if (= n 0)
39 665c255d 2023-08-04 jrmu (stream-car s)
40 665c255d 2023-08-04 jrmu (stream-ref (stream-cdr s) (- n 1))))
41 665c255d 2023-08-04 jrmu (define (stream-map proc . argstreams)
42 665c255d 2023-08-04 jrmu (if (stream-null? (car argstreams))
43 665c255d 2023-08-04 jrmu the-empty-stream
44 665c255d 2023-08-04 jrmu (cons-stream
45 665c255d 2023-08-04 jrmu (apply proc (map stream-car argstreams))
46 665c255d 2023-08-04 jrmu (apply stream-map (cons proc (map stream-cdr argstreams))))))
47 665c255d 2023-08-04 jrmu (define (stream-for-each proc s)
48 665c255d 2023-08-04 jrmu (if (stream-null? s)
49 665c255d 2023-08-04 jrmu 'done
50 665c255d 2023-08-04 jrmu (begin (proc (stream-car s))
51 665c255d 2023-08-04 jrmu (stream-for-each proc (stream-cdr s)))))
52 665c255d 2023-08-04 jrmu
53 665c255d 2023-08-04 jrmu (define (stream-enumerate-interval low high)
54 665c255d 2023-08-04 jrmu (if (> low high)
55 665c255d 2023-08-04 jrmu the-empty-stream
56 665c255d 2023-08-04 jrmu (cons-stream
57 665c255d 2023-08-04 jrmu low
58 665c255d 2023-08-04 jrmu (stream-enumerate-interval (+ low 1) high))))
59 665c255d 2023-08-04 jrmu (define (stream-filter pred s)
60 665c255d 2023-08-04 jrmu (if (stream-null? s)
61 665c255d 2023-08-04 jrmu the-empty-stream
62 665c255d 2023-08-04 jrmu (let ((scar (stream-car s)))
63 665c255d 2023-08-04 jrmu (if (pred scar)
64 665c255d 2023-08-04 jrmu (cons-stream scar (stream-filter pred (stream-cdr s)))
65 665c255d 2023-08-04 jrmu (stream-filter pred (stream-cdr s))))))
66 665c255d 2023-08-04 jrmu
67 665c255d 2023-08-04 jrmu (define (display-stream s)
68 665c255d 2023-08-04 jrmu (stream-for-each display-line s))
69 665c255d 2023-08-04 jrmu (define (display-line x)
70 665c255d 2023-08-04 jrmu (newline)
71 665c255d 2023-08-04 jrmu (display x))
72 665c255d 2023-08-04 jrmu
73 665c255d 2023-08-04 jrmu (define (test-case actual expected)
74 665c255d 2023-08-04 jrmu (newline)
75 665c255d 2023-08-04 jrmu (display "Actual: ")
76 665c255d 2023-08-04 jrmu (display actual)
77 665c255d 2023-08-04 jrmu (newline)
78 665c255d 2023-08-04 jrmu (display "Expected: ")
79 665c255d 2023-08-04 jrmu (display expected)
80 665c255d 2023-08-04 jrmu (newline))
81 665c255d 2023-08-04 jrmu
82 665c255d 2023-08-04 jrmu (define (integers-starting-from n)
83 665c255d 2023-08-04 jrmu (cons-stream n (integers-starting-from (+ n 1))))
84 665c255d 2023-08-04 jrmu (define integers (integers-starting-from 1))
85 665c255d 2023-08-04 jrmu
86 665c255d 2023-08-04 jrmu (define (divisible? x y) (= (remainder x y) 0))
87 665c255d 2023-08-04 jrmu (define no-sevens
88 665c255d 2023-08-04 jrmu (stream-filter (lambda (x) (not (divisible? x 7)))
89 665c255d 2023-08-04 jrmu integers))
90 665c255d 2023-08-04 jrmu
91 665c255d 2023-08-04 jrmu (define (fibgen a b)
92 665c255d 2023-08-04 jrmu (cons-stream a (fibgen b (+ a b))))
93 665c255d 2023-08-04 jrmu (define fibs (fibgen 0 1))
94 665c255d 2023-08-04 jrmu
95 665c255d 2023-08-04 jrmu (define (sieve s)
96 665c255d 2023-08-04 jrmu (cons-stream
97 665c255d 2023-08-04 jrmu (stream-car s)
98 665c255d 2023-08-04 jrmu (sieve (stream-filter
99 665c255d 2023-08-04 jrmu (lambda (x)
100 665c255d 2023-08-04 jrmu (not (divisible? x (stream-car s))))
101 665c255d 2023-08-04 jrmu (stream-cdr s)))))
102 665c255d 2023-08-04 jrmu
103 665c255d 2023-08-04 jrmu ;; (define primes (sieve (integers-starting-from 2)))
104 665c255d 2023-08-04 jrmu ;; (test-case (stream-ref primes 25) 101)
105 665c255d 2023-08-04 jrmu
106 665c255d 2023-08-04 jrmu (define ones (cons-stream 1 ones))
107 665c255d 2023-08-04 jrmu (define (add-streams s1 s2)
108 665c255d 2023-08-04 jrmu (stream-map + s1 s2))
109 665c255d 2023-08-04 jrmu (define integers (cons-stream 1 (add-streams ones integers)))
110 665c255d 2023-08-04 jrmu ;; (test-case (stream-ref integers 15) 16)
111 665c255d 2023-08-04 jrmu
112 665c255d 2023-08-04 jrmu (define fibs
113 665c255d 2023-08-04 jrmu (cons-stream 0
114 665c255d 2023-08-04 jrmu (cons-stream 1
115 665c255d 2023-08-04 jrmu (add-streams (stream-cdr fibs)
116 665c255d 2023-08-04 jrmu fibs))))
117 665c255d 2023-08-04 jrmu
118 665c255d 2023-08-04 jrmu (define (scale-stream stream factor)
119 665c255d 2023-08-04 jrmu (stream-map (lambda (x)
120 665c255d 2023-08-04 jrmu (* x factor))
121 665c255d 2023-08-04 jrmu stream))
122 665c255d 2023-08-04 jrmu (define double (cons-stream 1 (scale-stream double 2)))
123 665c255d 2023-08-04 jrmu
124 665c255d 2023-08-04 jrmu (define primes
125 665c255d 2023-08-04 jrmu (cons-stream
126 665c255d 2023-08-04 jrmu 2
127 665c255d 2023-08-04 jrmu (stream-filter prime? (integers-starting-from 3))))
128 665c255d 2023-08-04 jrmu (define (prime? n)
129 665c255d 2023-08-04 jrmu (define (iter ps)
130 665c255d 2023-08-04 jrmu (cond ((> (square (stream-car ps)) n) true)
131 665c255d 2023-08-04 jrmu ((divisible? n (stream-car ps)) false)
132 665c255d 2023-08-04 jrmu (else (iter (stream-cdr ps)))))
133 665c255d 2023-08-04 jrmu (iter primes))
134 665c255d 2023-08-04 jrmu
135 665c255d 2023-08-04 jrmu (define (mul-streams s1 s2)
136 665c255d 2023-08-04 jrmu (stream-map * s1 s2))
137 665c255d 2023-08-04 jrmu
138 665c255d 2023-08-04 jrmu (define (partial-sums s)
139 665c255d 2023-08-04 jrmu (define sums
140 665c255d 2023-08-04 jrmu (cons-stream (stream-car s)
141 665c255d 2023-08-04 jrmu (add-streams sums
142 665c255d 2023-08-04 jrmu (stream-cdr s))))
143 665c255d 2023-08-04 jrmu sums)
144 665c255d 2023-08-04 jrmu
145 665c255d 2023-08-04 jrmu (define (merge s1 s2)
146 665c255d 2023-08-04 jrmu (cond ((stream-null? s1) s2)
147 665c255d 2023-08-04 jrmu ((stream-null? s2) s1)
148 665c255d 2023-08-04 jrmu (else
149 665c255d 2023-08-04 jrmu (let ((s1car (stream-car s1))
150 665c255d 2023-08-04 jrmu (s2car (stream-car s2)))
151 665c255d 2023-08-04 jrmu (cond ((< s1car s2car)
152 665c255d 2023-08-04 jrmu (cons-stream
153 665c255d 2023-08-04 jrmu s1car
154 665c255d 2023-08-04 jrmu (merge (stream-cdr s1) s2)))
155 665c255d 2023-08-04 jrmu ((> s1car s2car)
156 665c255d 2023-08-04 jrmu (cons-stream
157 665c255d 2023-08-04 jrmu s2car
158 665c255d 2023-08-04 jrmu (merge s1 (stream-cdr s2))))
159 665c255d 2023-08-04 jrmu (else
160 665c255d 2023-08-04 jrmu (cons-stream
161 665c255d 2023-08-04 jrmu s1car
162 665c255d 2023-08-04 jrmu (merge (stream-cdr s1) (stream-cdr s2)))))))))
163 665c255d 2023-08-04 jrmu
164 665c255d 2023-08-04 jrmu (define (test-stream-list stream list)
165 665c255d 2023-08-04 jrmu (if (null? list)
166 665c255d 2023-08-04 jrmu 'done
167 665c255d 2023-08-04 jrmu (begin (display "A: ")
168 665c255d 2023-08-04 jrmu (display (stream-car stream))
169 665c255d 2023-08-04 jrmu (display " -- ")
170 665c255d 2023-08-04 jrmu (display "E: ")
171 665c255d 2023-08-04 jrmu (display (car list))
172 665c255d 2023-08-04 jrmu (newline)
173 665c255d 2023-08-04 jrmu (test-stream-list (stream-cdr stream) (cdr list)))))
174 665c255d 2023-08-04 jrmu
175 665c255d 2023-08-04 jrmu (define (integrate-series a)
176 665c255d 2023-08-04 jrmu (stream-map / a integers))
177 665c255d 2023-08-04 jrmu
178 665c255d 2023-08-04 jrmu (define exp-series
179 665c255d 2023-08-04 jrmu (cons-stream 1 (integrate-series exp-series)))
180 665c255d 2023-08-04 jrmu
181 665c255d 2023-08-04 jrmu (define cosine-series
182 665c255d 2023-08-04 jrmu (cons-stream
183 665c255d 2023-08-04 jrmu 1
184 665c255d 2023-08-04 jrmu (integrate-series (stream-map - sine-series))))
185 665c255d 2023-08-04 jrmu (define sine-series
186 665c255d 2023-08-04 jrmu (cons-stream
187 665c255d 2023-08-04 jrmu 0
188 665c255d 2023-08-04 jrmu (integrate-series cosine-series)))
189 665c255d 2023-08-04 jrmu
190 665c255d 2023-08-04 jrmu (define (mul-series s1 s2)
191 665c255d 2023-08-04 jrmu (cons-stream
192 665c255d 2023-08-04 jrmu (* (stream-car s1) (stream-car s2))
193 665c255d 2023-08-04 jrmu (add-streams
194 665c255d 2023-08-04 jrmu (scale-stream (stream-cdr s2) (stream-car s1))
195 665c255d 2023-08-04 jrmu (mul-series (stream-cdr s1) s2))))
196 665c255d 2023-08-04 jrmu
197 665c255d 2023-08-04 jrmu (define (invert-unit-series s)
198 665c255d 2023-08-04 jrmu (define x
199 665c255d 2023-08-04 jrmu (cons-stream
200 665c255d 2023-08-04 jrmu 1
201 665c255d 2023-08-04 jrmu (mul-series (stream-map - (stream-cdr s))
202 665c255d 2023-08-04 jrmu x)))
203 665c255d 2023-08-04 jrmu x)
204 665c255d 2023-08-04 jrmu
205 665c255d 2023-08-04 jrmu (define (div-series num den)
206 665c255d 2023-08-04 jrmu (let ((den-car (stream-car den)))
207 665c255d 2023-08-04 jrmu (if (zero? den-car)
208 665c255d 2023-08-04 jrmu (error "Denominator has zero constant term -- DIV-SERIES")
209 665c255d 2023-08-04 jrmu (scale-stream
210 665c255d 2023-08-04 jrmu (mul-series
211 665c255d 2023-08-04 jrmu num
212 665c255d 2023-08-04 jrmu (invert-unit-series (scale-stream den (/ 1 den-car))))
213 665c255d 2023-08-04 jrmu (/ 1 den-car)))))
214 665c255d 2023-08-04 jrmu
215 665c255d 2023-08-04 jrmu
216 665c255d 2023-08-04 jrmu (define (sqrt-improve guess x)
217 665c255d 2023-08-04 jrmu (define (average x y)
218 665c255d 2023-08-04 jrmu (/ (+ x y) 2))
219 665c255d 2023-08-04 jrmu (average guess (/ x guess)))
220 665c255d 2023-08-04 jrmu
221 665c255d 2023-08-04 jrmu (define (sqrt-stream x)
222 665c255d 2023-08-04 jrmu (define guesses
223 665c255d 2023-08-04 jrmu (cons-stream
224 665c255d 2023-08-04 jrmu 1
225 665c255d 2023-08-04 jrmu (stream-map (lambda (guess)
226 665c255d 2023-08-04 jrmu (sqrt-improve guess x))
227 665c255d 2023-08-04 jrmu guesses)))
228 665c255d 2023-08-04 jrmu guesses)
229 665c255d 2023-08-04 jrmu
230 665c255d 2023-08-04 jrmu (define (pi-summands n)
231 665c255d 2023-08-04 jrmu (cons-stream (/ 1 n)
232 665c255d 2023-08-04 jrmu (stream-map - (pi-summands (+ n 2)))))
233 665c255d 2023-08-04 jrmu (define pi-stream
234 665c255d 2023-08-04 jrmu (scale-stream (partial-sums (pi-summands 1)) 4))
235 665c255d 2023-08-04 jrmu
236 665c255d 2023-08-04 jrmu (define (euler-transform s)
237 665c255d 2023-08-04 jrmu (let ((s0 (stream-ref s 0))
238 665c255d 2023-08-04 jrmu (s1 (stream-ref s 1))
239 665c255d 2023-08-04 jrmu (s2 (stream-ref s 2)))
240 665c255d 2023-08-04 jrmu (cons-stream
241 665c255d 2023-08-04 jrmu (- s2 (/ (square (- s2 s1))
242 665c255d 2023-08-04 jrmu (+ s0 (* -2 s1) s2)))
243 665c255d 2023-08-04 jrmu (euler-transform (stream-cdr s)))))
244 665c255d 2023-08-04 jrmu
245 665c255d 2023-08-04 jrmu (define (make-tableau transform s)
246 665c255d 2023-08-04 jrmu (cons-stream s
247 665c255d 2023-08-04 jrmu (make-tableau transform
248 665c255d 2023-08-04 jrmu (transform s))))
249 665c255d 2023-08-04 jrmu
250 665c255d 2023-08-04 jrmu (define (stream-limit s tol)
251 665c255d 2023-08-04 jrmu (let* ((scar (stream-car s))
252 665c255d 2023-08-04 jrmu (scdr (stream-cdr s))
253 665c255d 2023-08-04 jrmu (scadr (stream-car scdr)))
254 665c255d 2023-08-04 jrmu (if (< (abs (- scar scadr)) tol)
255 665c255d 2023-08-04 jrmu scadr
256 665c255d 2023-08-04 jrmu (stream-limit scdr tol))))
257 665c255d 2023-08-04 jrmu
258 665c255d 2023-08-04 jrmu (define (sqrt x tolerance)
259 665c255d 2023-08-04 jrmu (stream-limit (sqrt-stream x) tolerance))
260 665c255d 2023-08-04 jrmu
261 665c255d 2023-08-04 jrmu (define (pairs s t)
262 665c255d 2023-08-04 jrmu (cons-stream
263 665c255d 2023-08-04 jrmu (list (stream-car s) (stream-car t))
264 665c255d 2023-08-04 jrmu (interleave
265 665c255d 2023-08-04 jrmu (stream-map
266 665c255d 2023-08-04 jrmu (lambda (x)
267 665c255d 2023-08-04 jrmu (list (stream-car s) x))
268 665c255d 2023-08-04 jrmu (stream-cdr t))
269 665c255d 2023-08-04 jrmu (pairs (stream-cdr s) (stream-cdr t)))))
270 665c255d 2023-08-04 jrmu (define (interleave s1 s2)
271 665c255d 2023-08-04 jrmu (if (stream-null? s1)
272 665c255d 2023-08-04 jrmu s2
273 665c255d 2023-08-04 jrmu (cons-stream (stream-car s1)
274 665c255d 2023-08-04 jrmu (interleave s2 (stream-cdr s1)))))
275 665c255d 2023-08-04 jrmu
276 665c255d 2023-08-04 jrmu (define (display-streams n . streams)
277 665c255d 2023-08-04 jrmu (if (> n 0)
278 665c255d 2023-08-04 jrmu (begin (newline)
279 665c255d 2023-08-04 jrmu (for-each
280 665c255d 2023-08-04 jrmu (lambda (s)
281 665c255d 2023-08-04 jrmu (display (stream-car s))
282 665c255d 2023-08-04 jrmu (display " -- "))
283 665c255d 2023-08-04 jrmu streams)
284 665c255d 2023-08-04 jrmu (apply display-streams
285 665c255d 2023-08-04 jrmu (cons (- n 1) (map stream-cdr streams))))))
286 665c255d 2023-08-04 jrmu
287 665c255d 2023-08-04 jrmu ;; Exercise 3.66. Examine the stream (pairs integers integers). Can you make any general comments about the order in which the pairs are placed into the stream? For example, about how many pairs precede the pair (1,100)? the pair (99,100)? the pair (100,100)? (If you can make precise mathematical statements here, all the better. But feel free to give more qualitative answers if you find yourself getting bogged down.)
288 665c255d 2023-08-04 jrmu
289 665c255d 2023-08-04 jrmu ;; (define the-pairs (pairs integers integers))
290 665c255d 2023-08-04 jrmu ;; (test-stream-list the-pairs
291 665c255d 2023-08-04 jrmu ;; '((1 1) (1 2) (2 2) (1 3) (2 3) (1 4) (3 3) (1 5) (2 4) (1 6) (3 4) (1 7) (2 5) (1 8) (4 4)))
292 665c255d 2023-08-04 jrmu
293 665c255d 2023-08-04 jrmu ;; 2(j-1) for the pair (1, j) for j > 1
294 665c255d 2023-08-04 jrmu ;; 2(2(j-2))+1 for the pair (2, j) for j > 1
295 665c255d 2023-08-04 jrmu ;; 2(2(2(j-3)))+3 for the pair (3, j) for j > 1
296 665c255d 2023-08-04 jrmu ;; 2(2(2(2(j-4))))+7 for the pair (4, j) for j > 1
297 665c255d 2023-08-04 jrmu ;; 2(2(2(2(2(j-5)))))+15
298 665c255d 2023-08-04 jrmu
299 665c255d 2023-08-04 jrmu ;; So, in general, (2^i)(j-i)+[summation of 2^(x-2)] from x = 2 to x = i
300 665c255d 2023-08-04 jrmu
301 665c255d 2023-08-04 jrmu ;; (1, 100) will appear as term 2(100-1) = 198
302 665c255d 2023-08-04 jrmu ;; (test-case (stream-ref the-pairs 197) '(1 100))
303 665c255d 2023-08-04 jrmu ;; (display-streams 100 the-pairs integers)
304 665c255d 2023-08-04 jrmu
305 665c255d 2023-08-04 jrmu (define double-summation (partial-sums double))
306 665c255d 2023-08-04 jrmu (newline)
307 665c255d 2023-08-04 jrmu (stream-ref double-summation 97)
308 665c255d 2023-08-04 jrmu (newline)
309 665c255d 2023-08-04 jrmu (display "New")
310 665c255d 2023-08-04 jrmu (newline)
311 665c255d 2023-08-04 jrmu (stream-ref double-summation 98)
312 665c255d 2023-08-04 jrmu