(require (lib "40.ss" "srfi"))
(require (lib "43.ss" "srfi"))
(define ones (stream-cons 1 ones))
(define (add-streams s1 s2)
(stream-map + s1 s2))
(define integers (stream-cons 1 (add-streams ones integers)))
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(define (partial-sums s)
(define sums
(stream-cons 0
(add-streams s sums)))
(stream-cdr sums))
(define (integrate-series s)
(stream-map / s integers))
(define exp-series
(stream-cons 1 (integrate-series exp-series)))
(define cosine-series
(stream-cons 1 (stream-map - (integrate-series sine-series))))
(define sine-series
(stream-cons 0 (integrate-series cosine-series)))
(define (mul-series s1 s2)
(stream-cons (* (stream-car s1) (stream-car s2))
(add-streams (scale-stream (stream-cdr s2) (stream-car s1))
(mul-series (stream-cdr s1) s2))))
(define (invert-unit-series S)
(stream-cons 1
(mul-series (stream-map - (stream-cdr S))
(invert-unit-series S))))
(define (div-series s1 s2)
(mul-series s1
(invert-unit-series s2)))
(define tan-series
(div-series sine-series cosine-series))
(define head stream-car)
(define tail
(lambda (stream) (stream-cdr stream)))
(letrec (
(n 10)
(loop (lambda (s)
(if (not (= n 0))
(begin (set! n (- n 1))
(write (head s))
(newline)
(loop (tail s)))))))
(loop tan-series))