43 lines
1.2 KiB
Racket
43 lines
1.2 KiB
Racket
#lang racket/base
|
|
;; Trivial demonstration of an os2.rkt virtual machine.
|
|
|
|
(require "os2.rkt")
|
|
(require racket/pretty)
|
|
|
|
(define (super-alarm msecs)
|
|
(wrap-evt (alarm-evt msecs) (lambda (_) (current-inexact-milliseconds))))
|
|
|
|
(define (sleep n k)
|
|
(transition k
|
|
(add-role (topic-subscriber (super-alarm (+ (current-inexact-milliseconds) n)))
|
|
(handlers #f #f (lambda (eid topic now)
|
|
(lambda (k)
|
|
(extend-transition (k)
|
|
(delete-role eid))))))))
|
|
|
|
(define (example-process delay)
|
|
(write `(sleeping for ,delay milliseconds))
|
|
(newline)
|
|
(sleep delay (lambda ()
|
|
(write `(awoke after ,delay milliseconds))
|
|
(newline)
|
|
(transition 'no-state (kill)))))
|
|
|
|
(define spy
|
|
(lambda ()
|
|
(define (hs label)
|
|
(define ((w kind) . args) (write `(,label ,kind ,@args)) (newline) values)
|
|
(handlers (w 'presence)
|
|
(w 'absence)
|
|
(w 'message)))
|
|
(transition 'spy-state
|
|
(add-role (topic-publisher (wild) #:virtual? #t) (hs 'subscriber->publisher))
|
|
(add-role (topic-subscriber (wild) #:virtual? #t) (hs 'publisher->subscriber)))))
|
|
|
|
(ground-vm (lambda ()
|
|
(transition 'no-state
|
|
(spawn spy)
|
|
(spawn (lambda () (example-process 1000)))
|
|
(spawn (lambda () (example-process 2000)))
|
|
(kill))))
|