The code for this section is in Common Lisp.
Here’s the code for integral
and solve
. Note the usage of labels
to translate Scheme’s recursive variable definitions to CL:
(defun integral (delayed-integrand initial-value dt) (labels ( (int () (cons-stream initial-value (let ((integrand (force delayed-integrand))) (add-streams (scale-stream integrand dt) (int)))))) (int))) (defun solve (f y0 dt) (labels ( (y () (integral (delay (dy)) y0 dt)) (dy () (stream-map f (y)))) (y)))
Exercise 3.77
(defun integral (delayed-integrand initial-value dt) (cons-stream initial-value (let ((integrand (force delayed-integrand))) (if (stream-null? integrand) the-empty-stream (integral (delay (stream-cdr integrand)) (+ (* dt (stream-car integrand)) initial-value) dt)))))
Exercise 3.78
(defun solve-2nd (a b y0 dy0 dt) (labels ( (y () (integral (delay (dy)) y0 dt)) (dy () (integral (delay (ddy)) dy0 dt)) (ddy () (add-streams (scale-stream (dy) a) (scale-stream (y) b)))) (y)))
Exercise 3.79
(defun solve-2nd (f y0 dy0 dt) (labels ( (y () (integral (delay (dy)) y0 dt)) (dy () (integral (delay (ddy)) dy0 dt)) (ddy () (stream-map f (dy) (y)))) (y)))
Exercise 3.80
(defun RLC (R L C dt) (labels ( (rlc-model (vc0 il0) (labels ( (il () (integral (delay (dil)) il0 dt)) (vc () (integral (delay (dvc)) vc0 dt)) (dil () (add-streams (scale-stream (vc) (/ 1 L)) (scale-stream (il) (- (/ R L))))) (dvc () (scale-stream (il) (/ -1 C)))) (cons (vc) (il))))) #'rlc-model))