RosettaCodeData/Task/Active-object/Racket/active-object.rkt

31 lines
769 B
Racket

#lang racket
(require (only-in racket/gui sleep/yield timer%))
(define active%
(class object%
(super-new)
(init-field k) ; input function
(field [s 0]) ; state
(define t_0 0)
(define/public (input new-k) (set! k new-k))
(define/public (output) s)
(define (callback)
(define t_1 (/ (- (current-inexact-milliseconds) start) 1000))
(set! s (+ s (* (+ (k t_0) (k t_1))
(/ (- t_1 t_0) 2))))
(set! t_0 t_1))
(define start (current-inexact-milliseconds))
(new timer%
[interval 1000]
[notify-callback callback])))
(define active (new active% [k (λ (t) (sin (* 2 pi 0.5 t)))]))
(sleep/yield 2)
(send active input (λ _ 0))
(sleep/yield 0.5)
(displayln (send active output))