31 lines
831 B
Plaintext
31 lines
831 B
Plaintext
(require 'timer)
|
|
|
|
;; returns an 'object' : (&lamdba; message [values])
|
|
;; messages : input, output, sample, inspect
|
|
(define (make-active)
|
|
(let [
|
|
(t0 #f) (dt 0)
|
|
(t 0) (Kt 0) ; K(t)
|
|
(S 0) (K 0)]
|
|
(lambda (message . args)
|
|
(case message
|
|
((output) (// S 2))
|
|
((input ) (set! K (car args)) (set! t0 #f))
|
|
((inspect) (printf " Active obj : t0 %v t %v S %v " t0 t Kt (// S 2 )))
|
|
((sample)
|
|
(when (procedure? K)
|
|
;; recved new K : init
|
|
(unless t0
|
|
(set! t0 (first args))
|
|
(set! t 0)
|
|
(set! Kt (K 0)))
|
|
|
|
;; integrate K(t) every time 'sample message is received
|
|
(set! dt (- (first args) t t0)) ;; compute once K(t)
|
|
(set! S (+ S (* dt Kt)))
|
|
(set! t (+ t dt))
|
|
(set! Kt (K t))
|
|
(set! S (+ S (* dt Kt)))))
|
|
|
|
(else (error "active:bad message" message))))))
|