syndicate-2017/racket/syndicate/examples/actor/example-glitch.rkt

62 lines
1.2 KiB
Racket

#lang syndicate
;; Demonstrate FRP-like "glitching"
;;
;; Based on an example from the FRP survey of Bainomugisha et al.
;; 2013:
;;
;; var1 = 1
;; var2 = var1 * 1
;; var3 = var1 + var2
;;
;; Sample output; notice doubled 'var3 printing:
;;
;; 'var1 = 1
;; 'var2 = 1
;; 'var3 = 2
;; ---
;; 'var1 = 2
;; 'var2 = 2
;; 'var3 = 3
;; 'var3 = 4
;; ---
;; 'var1 = 3
;; 'var2 = 3
;; 'var3 = 5
;; 'var3 = 6
;; ---
;; 'var1 = 4
;; 'var2 = 4
;; 'var3 = 7
;; 'var3 = 8
;; ---
(require/activate syndicate/drivers/timestate)
(spawn (field [var1 1])
(assert (list 'var1 (var1)))
(on (message 'tick)
(var1 (+ (var1) 1))))
(spawn (during (list 'var1 $v)
(assert (list 'var2 (* v 1)))))
(spawn (during (list 'var1 $v1)
(during (list 'var2 $v2)
(assert (list 'var3 (+ v1 v2))))))
(spawn (on (asserted (list $k $v))
(printf "~v = ~v\n" k v)))
(spawn* (until (asserted (observe 'tick)))
(sleep 0.1)
(printf "---\n")
(send! 'tick)
(sleep 0.1)
(printf "---\n")
(send! 'tick)
(sleep 0.1)
(printf "---\n")
(send! 'tick)
(sleep 0.1)
(printf "---\n"))