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

55 lines
1.8 KiB
Racket

#lang syndicate
(require syndicate/threaded)
(require/activate syndicate/drivers/timer)
(spawn
(during/spawn (observe `(fib ,$n ,_))
#:spawn spawn/thread
(on-start (log-info "Computing fib ~a..." n))
(on-stop (log-info "Leaving fib ~a" n))
(assert `(up ,n))
(on-start
(flush!)
(react
(assert `(fib ,n
,(let ((answer
(let f ((n n))
(if (< n 2)
n
(+ (f (- n 1))
(f (- n 2)))))))
(if (= n 36)
(error 'fib "Deliberate, hardcoded failure for n=36")
answer))))))))
(dataspace/thread
(spawn
(field [tick-count 0])
(define (arm!)
(log-info "Tick ~v!" (tick-count))
(send! (outbound (set-timer 'tick 1000 'relative))))
(on (message (inbound (timer-expired 'tick _)))
(tick-count (+ (tick-count) 1))
(arm!))
(on-start (arm!)))
(field [counter 0])
(react
(during (inbound `(up ,$n))
(on-start (log-info "up: ~v" n))
(on-stop (log-info "down: ~v" n)
(counter (+ (counter) 1)))))
(react (stop-when (asserted (inbound `(fib 36 ,$v)))
(log-info "fib 36 is ~a" v)))
(react (stop-when (asserted (inbound `(fib 38 ,$v)))
(log-info "fib 38 is ~a" v)))
(until (rising-edge (= (counter) 2)))
(log-info "Quitting main")
(until (message (inbound (timer-expired 'wait _)))
(on-start (send! (outbound (set-timer 'wait 100 'relative)))))
(quit-dataspace!))