syndicate-2017/racket/syndicate/examples/actor/example-termination-scripts...

40 lines
1.2 KiB
Racket

#lang syndicate
;; Demonstrate handling of facet termination.
(require racket/pretty)
(struct milestone (facet-id message) #:prefab)
(struct presence (detail) #:prefab)
(define (milestone! . detail)
(printf ">>> ~v ~v\n" (current-facet-id) detail)
(send! (milestone (current-facet-id) detail)))
(spawn (field [trace-rev '()])
(define (push! w x) (trace-rev (cons (list w x) (trace-rev))))
(on-start
(until (asserted (observe 'E)))
(send! 'E)
(until (retracted (observe 'E)))
(flush!)
(flush!)
(flush!)
(pretty-print (reverse (trace-rev))))
(on (asserted (presence $p)) (push! '+ (presence p)))
(on (retracted (presence $p)) (push! '- (presence p)))
(on (message (milestone $w $d)) (push! '! (milestone w d))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(spawn
(assert (presence 'outer))
(on-start (milestone! 'on-start 'outer))
(on-stop (milestone! 'on-stop 'outer))
(on (message 'E)
(milestone! 'on-E 'outer 'pre-stop)
(stop-facet (current-facet-id)
(milestone! 'on-E 'outer 'post-stop))
(milestone! 'on-E 'outer 'mid-stop)))