syndicate-2017/racket/syndicate/examples/actor/fib-server.rkt

37 lines
1.1 KiB
Racket
Raw Normal View History

2016-07-21 02:13:43 +00:00
#lang syndicate/actor
(require syndicate/threaded)
(require/activate syndicate/drivers/timer)
(actor
(react
(during/actor (observe `(fib ,$n ,_))
#:actor actor/thread
(assert `(fib ,n
,(begin
(log-info "Computing fib ~a..." n)
(let f ((n n))
(if (< n 2)
n
(+ (f (- n 1))
(f (- n 2)))))))))))
(dataspace/thread
(actor
(field [tick-count 0])
(define (arm!)
(log-info "Tick ~v!" (tick-count))
(send! (set-timer 'tick 1000 'relative) #:meta-level 1))
(react (on (message (timer-expired 'tick _) #:meta-level 1)
(tick-count (+ (tick-count) 1))
(arm!))
(on-start (arm!))))
(react/suspend (done)
(on (asserted `(fib 36 ,$v) #:meta-level 1)
(log-info "fib 36 is ~a" v))
(on (asserted `(fib 38 ,$v) #:meta-level 1)
(log-info "fib 38 is ~a" v)
(done))
(on-stop (log-info "Quitting main"))))