diff --git a/racket/syndicate/actor.rkt b/racket/syndicate/actor.rkt index b780765..2c48120 100644 --- a/racket/syndicate/actor.rkt +++ b/racket/syndicate/actor.rkt @@ -565,14 +565,14 @@ (syntax-parse stx [(_ field-name absent-expr P expr on-add:on-add on-remove:on-remove) (quasisyntax/loc stx - (let () + (let ((F field-name)) (on (asserted P) #:priority *query-priority* #,@(schedule-query-handler-stxs (attribute on-add.expr)) - (field-name expr)) + (F expr)) (on (retracted P) #:priority *query-priority-high* #,@(schedule-query-handler-stxs (attribute on-remove.expr)) - (field-name absent-expr)) - field-name))])) + (F absent-expr)) + F))])) (define-syntax (query-set stx) (syntax-parse stx @@ -586,14 +586,14 @@ (syntax-parse stx [(_ field-name P expr on-add:on-add on-remove:on-remove) (quasisyntax/loc stx - (let () + (let ((F field-name)) (on (asserted P) #:priority *query-priority* #,@(schedule-query-handler-stxs (attribute on-add.expr)) - (field-name (set-add (field-name) expr))) + (F (set-add (F) expr))) (on (retracted P) #:priority *query-priority-high* #,@(schedule-query-handler-stxs (attribute on-remove.expr)) - (field-name (set-remove (field-name) expr))) - field-name))])) + (F (set-remove (F) expr))) + F))])) (define-syntax (query-hash stx) (syntax-parse stx @@ -607,20 +607,20 @@ (syntax-parse stx [(_ field-name P key-expr value-expr on-add:on-add on-remove:on-remove) (quasisyntax/loc stx - (let () + (let ((F field-name)) (on (asserted P) #:priority *query-priority* (let ((key key-expr)) - (when (hash-has-key? (field-name) key) + (when (hash-has-key? (F) key) (log-warning "query-hash: field ~v with pattern ~v: overwriting existing entry ~v" 'field-name 'P key)) #,@(schedule-query-handler-stxs (attribute on-add.expr)) - (field-name (hash-set (field-name) key value-expr)))) + (F (hash-set (F) key value-expr)))) (on (retracted P) #:priority *query-priority-high* #,@(schedule-query-handler-stxs (attribute on-remove.expr)) - (field-name (hash-remove (field-name) key-expr))) - field-name))])) + (F (hash-remove (F) key-expr))) + F))])) (define-syntax (query-hash-set stx) (syntax-parse stx @@ -634,14 +634,14 @@ (syntax-parse stx [(_ field-name P key-expr value-expr on-add:on-add on-remove:on-remove) (quasisyntax/loc stx - (let () + (let ((F field-name)) (on (asserted P) #:priority *query-priority* #,@(schedule-query-handler-stxs (attribute on-add.expr)) - (field-name (hashset-add (field-name) key-expr value-expr))) + (F (hashset-add (F) key-expr value-expr))) (on (retracted P) #:priority *query-priority-high* #,@(schedule-query-handler-stxs (attribute on-remove.expr)) - (field-name (hashset-remove (field-name) key-expr value-expr))) - field-name))])) + (F (hashset-remove (F) key-expr value-expr))) + F))])) (define-syntax-rule (define/query-value id ae P x ...) (define id (query-value id ae P x ...))) (define-syntax-rule (define/query-set id P x ...) (define id (query-set id P x ...))) diff --git a/racket/syndicate/examples/actor/example-bug-query-scope.rkt b/racket/syndicate/examples/actor/example-bug-query-scope.rkt new file mode 100644 index 0000000..b93e31c --- /dev/null +++ b/racket/syndicate/examples/actor/example-bug-query-scope.rkt @@ -0,0 +1,30 @@ +#lang syndicate/actor +;; 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. + +(actor (define/query-value w #f ($ w (list 'val _)) w) + (begin/dataflow + (log-info "w is ~v" (w)))) + +(actor (assert (list 'val 123)))