#lang syndicate
;; Demonstrates a (fixed) bug in define/query-value scoping.
;;
;; Buggy output:
;;
;; w is #f
;; Process #f (0) died with exception:
;; application: not a procedure;
;;  expected a procedure that can be applied to arguments
;;   given: '(val 123)
;;   arguments...:
;;    '(val 123)
;;   context...:
;;
;; Expected output:
;;
;; w is #f
;; w is '(val 123)
;;
;; Diagnosis:
;;
;; The field being defined, w, was being shadowed by the w binding in
;; the query pattern. Adding `(let ((F field-name)) ...)` in the
;; query-value* macro (and friends) avoids the issue.

(spawn (define/query-value w #f ($ w (list 'val _)) w)
       (begin/dataflow
         (log-info "w is ~v" (w))))

(spawn (assert (list 'val 123)))
