3.77にちょっとはまった.
;;exercise3.77 (define (solve f y0 dt) (define dy (stream-map f y)) (define y (integral (delay dy) y0 dt)) y) (define (integral delayed-integrand initilal-value dt) (cons-stream initilal-value (let ((integrand (force delayed-integrand))) (if (stream-null? integrand) the-empty-stream (integral (delay (stream-cdr integrand)) (+ (* dt (stream-car integrand)) initilal-value) dt)))))
(integral (delay (stream-cdr integrand))
ここのdelayがなければ,再起呼び出しのletのforceで無限ループに突入する.
integralに渡すintegrandはdelayされていなければいけない.
;;exercise3.78 (define (solve-2nd a b y0 dy0 dt) (define ddy (add-streams (scale-stream dy a) (scale-stream y b))) (define dy (integral (delay ddy) dy0 dt)) (define y (integral (delay dy) y0 dt)) y) ;;exercise3.78 (define (solve-2nd f y0 dy0 dt) (define ddy (stream-map f dy y)) (define dy (integral (delay ddy) dy0 dt)) (define y (integral (delay y) y0 dt)) y) (stream-ref-print (solve-2nd (lambda (dy y) (+ (* -2 dy) (* -16 y))) 1 0 0.01) 100)