55 lines
1.8 KiB
Racket
55 lines
1.8 KiB
Racket
#lang syndicate/actor
|
|
|
|
(require syndicate/threaded)
|
|
(require/activate syndicate/drivers/timer)
|
|
|
|
(actor
|
|
(react
|
|
(during/actor (observe `(fib ,$n ,_))
|
|
#:actor actor/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
|
|
(actor
|
|
(field [tick-count 0])
|
|
(define (arm!)
|
|
(log-info "Tick ~v!" (tick-count))
|
|
(send! (outbound (set-timer 'tick 1000 'relative))))
|
|
(react (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))))))
|