diff --git a/racket/typed/roles.rkt b/racket/typed/roles.rkt index a8431d5..2105cc1 100644 --- a/racket/typed/roles.rkt +++ b/racket/typed/roles.rkt @@ -24,6 +24,7 @@ define/query-value define/query-set define/query-hash + define/dataflow on-start on-stop ;; endpoints assert know on field @@ -513,6 +514,22 @@ (define-simple-macro (on-stop e ...) (on stop e ...)) +(define-typed-syntax define/dataflow + [(define/dataflow x:id τ:type e) ≫ + [⊢ e ≫ e- (⇐ : τ)] + #:fail-unless (pure? #'e-) "expression must be pure" + ;; because the begin/dataflow body is scheduled to run at some later point, + ;; the initial value is visible e.g. immediately after the define/dataflow +;; #:with place-holder (attach #'(#%datum- #f) ': #'τ.norm) + ---------------------------------------- + [≻ (begin (field [x τ e-]) + (begin/dataflow (set! x e-)))]] + [(define/dataflow x:id e) ≫ + [⊢ e ≫ e- (⇒ : τ)] + #:fail-unless (pure? #'e-) "expression must be pure" + ---------------------------------------- + [≻ (define/dataflow x τ e-)]]) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Expressions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/racket/typed/tests/define-dataflow.rkt b/racket/typed/tests/define-dataflow.rkt new file mode 100644 index 0000000..2947bb8 --- /dev/null +++ b/racket/typed/tests/define-dataflow.rkt @@ -0,0 +1,11 @@ +#lang typed/syndicate/roles + +(run-ground-dataspace (U) +(spawn (U) + (start-facet x + (field [y Int 0]) + (define/dataflow x (add1 (ref y))) + (displayln (add1 (ref x))) + ;; print 2 + #f)) +)