racket-matrix-2012/os2-example.rkt

50 lines
1.4 KiB
Racket

#lang racket/base
;; Trivial demonstration of an os2.rkt virtual machine.
(require "os2.rkt")
(require "os2-timer.rkt")
(require racket/pretty)
(define (sleep state n k)
(define id (gensym 'sleep-id))
(transition state
(send-message (set-timer id n 'relative))
(role (topic-subscriber (timer-expired id (wild)))
#:name id
#:state state
[(timer-expired (== id) now)
(sequence-actions (transition state)
k
(delete-role id))])))
(define (example-process delay)
(write `(sleeping for ,delay milliseconds))
(newline)
(sleep 'no-state
delay
(lambda (state)
(if (> delay 1500)
(error 'example-process "Oh noes!")
(begin (write `(awoke after ,delay milliseconds))
(newline)
(transition state (quit)))))))
(define spy
(lambda (spy-pid)
(define (hs label)
(define ((w kind) . args) (write `(,label ,kind ,@args)) (newline) transition)
(handlers (w 'presence)
(w 'absence)
(w 'message)))
(transition 'spy-state
(add-role 's->p (topic-publisher (wild) #:monitor? 'everything) (hs 'subscriber->publisher))
(add-role 'p->s (topic-subscriber (wild) #:monitor? 'everything) (hs 'publisher->subscriber)))))
(ground-vm (lambda (boot-pid)
(transition 'no-state
(spawn (timer-driver 'example-timer-driver))
(spawn spy)
(spawn (lambda (pid) (example-process 1000)))
(spawn (lambda (pid) (example-process 2000)))
(quit))))