diff --git a/collects/racket/match/parse-helper.rkt b/collects/racket/match/parse-helper.rkt index 30f3bb40ff..8ad524ede8 100644 --- a/collects/racket/match/parse-helper.rkt +++ b/collects/racket/match/parse-helper.rkt @@ -136,7 +136,10 @@ (define (match-expander-transform parse/cert cert expander stx accessor error-msg) (let* ([expander (syntax-local-value (cert expander))] - [transformer (accessor expander)]) + [transformer (accessor expander)] + [transformer (if (set!-transformer? transformer) + (set!-transformer-procedure transformer) + transformer)]) (unless transformer (raise-syntax-error #f error-msg expander)) (let* ([introducer (make-syntax-introducer)] [certifier (match-expander-certifier expander)] diff --git a/collects/racket/match/patterns.rkt b/collects/racket/match/patterns.rkt index 4ddbb9916d..9ba024c964 100644 --- a/collects/racket/match/patterns.rkt +++ b/collects/racket/match/patterns.rkt @@ -208,6 +208,19 @@ identifier?))]))) (define-struct match-expander (match-xform legacy-xform macro-xform certifier) - #:property prop:procedure (struct-field-index macro-xform)) +#| #:property prop:procedure (lambda (me stx) + (define xf (match-expander-macro-xform me)) + (define xf* (if (set!-transformer? xf) + (set!-transformer-procedure xf) + xf)) + (xf* stx))|# + #:property prop:set!-transformer (lambda (me stx) + (define xf (match-expander-macro-xform me)) + (if (set!-transformer? xf) + ((set!-transformer-procedure xf) stx) + (syntax-case stx (set!) + [(set! . _) + (raise-syntax-error #f "cannot mutate syntax identifier" stx)] + [_ (xf stx)])))) (provide (struct-out match-expander)) diff --git a/collects/tests/match/examples.rkt b/collects/tests/match/examples.rkt index c26f811a67..d7f2ad870a 100644 --- a/collects/tests/match/examples.rkt +++ b/collects/tests/match/examples.rkt @@ -653,5 +653,23 @@ (list a)))) #t] [_ #f])) + + (comp '(2 7) + (let () + (define-match-expander foo + (syntax-rules () [(_) 1]) + (syntax-id-rules (set!) + [(set! _ v) v] + [(_) 2])) + (list (foo) + (set! foo 7)))) + + (comp 0 + (let () + (define-match-expander foo + (syntax-id-rules () [_ 10])) + (match 10 + [(foo) 0] + [_ 1]))) ))