diff --git a/racket/collects/syntax/transformer.rkt b/racket/collects/syntax/transformer.rkt index b08844afb7..9f78cd160a 100644 --- a/racket/collects/syntax/transformer.rkt +++ b/racket/collects/syntax/transformer.rkt @@ -4,17 +4,22 @@ (provide make-variable-like-transformer) +(struct variable-like-transformer [procedure] + #:property prop:procedure (struct-field-index procedure) + #:property prop:set!-transformer (struct-field-index procedure)) + (define (make-variable-like-transformer ref-stx [set!-handler #f]) - (unless (syntax? ref-stx) - (raise-type-error 'make-variable-like-transformer "syntax?" ref-stx)) + (unless (or (syntax? ref-stx) (procedure? ref-stx)) + (raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure?)" ref-stx)) (unless (or (syntax? set!-handler) (procedure? set!-handler) (eq? set!-handler #f)) (raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure? #f)" set!-handler)) - (make-set!-transformer + (variable-like-transformer (lambda (stx) (syntax-case stx (set!) [id (identifier? #'id) - ref-stx] + (cond [(procedure? ref-stx) (ref-stx stx)] + [else ref-stx])] [(set! id val) (cond [(procedure? set!-handler) (set!-handler stx)]