(require (lib "40.ss" "srfi"))
(require (lib "43.ss" "srfi"))
(define (ln2-from n)
(stream-cons (/ 1.0 n)
(stream-map - (ln2-from (+ n 1)))))
(define ln2-stream (ln2-from 1))
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(define (add-streams s1 s2)
(stream-map + s1 s2))
(define (partial-sums s)
(define sums
(stream-cons 0
(add-streams s sums)))
(stream-cdr sums))
(define ln2 (partial-sums ln2-stream))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define (square x) (* x x))
(define (euler-transform s)
(let ((s0 (stream-ref s 0))
(s1 (stream-ref s 1))
(s2 (stream-ref s 2)))
(stream-cons (- s2 (/ (square (- s2 s1))
(+ s0 (* -2 s1) s2)))
(euler-transform (stream-cdr s)))))
(define (make-tableau transform s)
(stream-cons s
(make-tableau transform
(transform s))))
(define (accelerated-sequence transform s)
(stream-map stream-car
(make-tableau transform s)))
(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 (accelerated-sequence euler-transform ln2)))