Exercise 3.58. Give an interpretation of the stream computed by the following procedure:
(define (expand num den radix)
(cons-stream
(quotient (* num radix) den)
(expand (remainder (* num radix) den) den radix)))
(Quotient is a primitive that returns the integer quotient of two integers.) What are the successive elements produced by (expand 1 7 10) ? What is produced by (expand 3 8 10) ?
只要 radix 的地方为 10,这个 expand 所得到的序列就是 num * radix / den 的带小数的商–stream-car 是商小数点之前的部分,之后的 stream-cdr 是小数点之后的部分。
(load "stream.scm")
(define (expand num den radix)
(cons-stream
(quotient (* num radix) den)
(expand (remainder (* num radix) den) den radix)))
;;; tests begin
(load "../testframe.scm")
; 10.0 / 7 = 1.4285714285714286
(let ((get10/7 (expand 1 7 10)))
(assert= (stream-car get10/7) 1)
(assert= (stream-ref get10/7 1) 4)
(assert= (stream-ref get10/7 2) 2)
(assert= (stream-ref get10/7 6) 1))
; 30.0 / 8 = 3.75
(let ((get30/8 (expand 3 8 10)))
(assert= (stream-ref get30/8 0) 3)
(assert= (stream-ref get30/8 1) 7)
(assert= (stream-ref get30/8 2) 5)
(assert= (stream-ref get30/8 3) 0))