Implement till 3.69

main
Felix Martin 2021-01-07 12:14:27 -05:00
parent 52495ade20
commit 4c4d9fe8ba
1 changed files with 51 additions and 1 deletions

View File

@ -138,5 +138,55 @@
; The explanations on Schemewiki are good, though:
; http://community.schemewiki.org/?sicp-ex-3.66
(display "\nex-3.67\n")
(display "\nex-3.67 - all-pairs\n")
(define (all-pairs s t)
(cons-stream
(list (stream-car s) (stream-car t))
(interleave
(interleave
(stream-map (lambda (x) (list (stream-car s) x))
(stream-cdr t))
(stream-map (lambda (x) (list x (stream-car t)))
(stream-cdr s)))
(all-pairs (stream-cdr s) (stream-cdr t)))))
(define int-pairs (all-pairs integers integers))
(assert (stream-ref int-pairs 10) '(3 4))
(display "\nex-3.68 - non-lazy pairs\n")
(display "[answered]\n")
(define (bad-pairs s t)
(interleave
(stream-map (lambda (x) (list (stream-car s) x))
t)
(pairs (stream-cdr s) (stream-cdr t))))
; MIT-Scheme uses applicative-order evluation. Hence, pairs gets evaluated
; recursively. Since there is no delay this implementation results in an
; endless loop.
(display "\nex-3.69 - triples\n")
(define (triples a b c)
(cons-stream
(list (stream-car a) (stream-car b) (stream-car c))
(interleave
(stream-map (lambda (pairs) (cons (stream-car a) pairs))
(pairs b (stream-cdr c)))
(triples (stream-cdr a) (stream-cdr b) (stream-cdr c)))))
(define (pythagorean? a b c)
(= (+ (* a a) (* b b)) (* c c)))
(define pythagorean-triples
(stream-filter (lambda (ts) (apply pythagorean? ts))
(triples integers integers integers)))
(assert (stream-ref pythagorean-triples 1) '(6 8 10))
(display "\nex-3.70\n")
; (display "\nex-3.71\n")