diff --git a/pkgs/racket-test/tests/stxparse/test.rkt b/pkgs/racket-test/tests/stxparse/test.rkt index 181d002245..29e6c7398c 100644 --- a/pkgs/racket-test/tests/stxparse/test.rkt +++ b/pkgs/racket-test/tests/stxparse/test.rkt @@ -641,3 +641,7 @@ (check-eq? (x) (void)) )) +;; from Jay McCarthy (4/2016) +(tok (1 2 3) (~datum (1 2 3)) 'ok) +(tok (1 2 . 3) (~datum (1 2 . 3)) 'ok) +(tok (1 . (2 3)) (~datum (1 . (2 3))) 'ok) diff --git a/racket/collects/syntax/parse/private/parse.rkt b/racket/collects/syntax/parse/private/parse.rkt index 01f2360ece..a0ba0464df 100644 --- a/racket/collects/syntax/parse/private/parse.rkt +++ b/racket/collects/syntax/parse/private/parse.rkt @@ -545,10 +545,14 @@ Conventions: k)))) argu))))] [#s(pat:datum attrs datum) - #`(let ([d (if (syntax? x) (syntax-e x) x)]) - (if (equal? d (quote datum)) - k - (fail (failure pr (es-add-atom 'datum es)))))] + (with-syntax ([unwrap-x + (if (atomic-datum-stx? #'datum) + #'(if (syntax? x) (syntax-e x) x) + #'(syntax->datum (datum->syntax #f x)))]) + #`(let ([d unwrap-x]) + (if (equal? d (quote datum)) + k + (fail (failure pr (es-add-atom 'datum es))))))] [#s(pat:literal attrs literal input-phase lit-phase) #`(if (and (identifier? x) (free-identifier=? x (quote-syntax literal) input-phase lit-phase)) diff --git a/racket/collects/syntax/parse/private/rep.rkt b/racket/collects/syntax/parse/private/rep.rkt index 6700187fe2..c110dd1254 100644 --- a/racket/collects/syntax/parse/private/rep.rkt +++ b/racket/collects/syntax/parse/private/rep.rkt @@ -26,6 +26,9 @@ ;; (mandatory from outside, at least) (provide/contract + [atomic-datum-stx? + (-> syntax? + boolean?)] [parse-rhs (-> syntax? (or/c false/c (listof sattr?)) boolean? #:context (or/c false/c syntax?) @@ -73,7 +76,7 @@ ;; ---- -(define (atomic-datum? stx) +(define (atomic-datum-stx? stx) (let ([datum (syntax-e stx)]) (or (null? datum) (boolean? datum) @@ -521,7 +524,7 @@ (identifier? #'id) (parse-pat:id stx decls allow-head?)] [datum - (atomic-datum? #'datum) + (atomic-datum-stx? #'datum) (create-pat:datum (syntax->datum #'datum))] [(~var . rest) (disappeared! stx)