#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))))