syndicate-2017/racket/syndicate/examples/actor/example-action-after-suspen...

44 lines
1.0 KiB
Racket

#lang syndicate
;; Test case for a bug relating to use of parameters to accumulate
;; actions across react/suspend when an intermediate parameterization
;; for current-dataflow-subject-id has taken place.
;;
;; Expected output:
;; flag: 'clear
;; flag: 'set
;; - '(saw ping)
;;
;; Previously expected output:
;; flag: 'clear
;; - 'first
;; flag: 'set
;; - '(saw ping)
;;
;; Buggy output:
;; flag: 'clear
;; - 'first
;; flag: 'clear
(struct x (v) #:prefab)
(spawn (on (message (x 'ping))
(send! (x 'pong))))
(spawn (field [flag 'clear])
(begin/dataflow
(printf "flag: ~v\n" (flag)))
(field [spec #f])
(begin/dataflow
(when (spec)
(let-event [(asserted (observe (x (spec))))]
(send! (x (list 'saw (spec))))
(flag 'set))))
(on-start (send! (x 'first)))
(on (message (x 'first))
(spec 'ping)))
(spawn (on (message (x $v))
(printf "- ~v\n" v)))