diff --git a/pkgs/racket-test/tests/stxparse/test-litset.rkt b/pkgs/racket-test/tests/stxparse/test-litset.rkt index 4c61efa492..2938476074 100644 --- a/pkgs/racket-test/tests/stxparse/test-litset.rkt +++ b/pkgs/racket-test/tests/stxparse/test-litset.rkt @@ -99,13 +99,19 @@ ;; Litsets with datum-lits -(test-case "litset, datum-lits" - (let ([one 1]) - (define-literal-set lits-d #:datum-literals (one two) ()) +(let ([one 1]) + (define-literal-set lits-d #:datum-literals (one two) ()) + + (test-case "litset, datum-lits" (syntax-parse #'one #:literal-sets (lits-d) [one (void)]) (let ([one 2]) - (syntax-parse #'one #:literal-sets (lits-d) [one (void)])))) + (syntax-parse #'one #:literal-sets (lits-d) [one (void)]))) + (test-case "litset->predicate, datum-lits" + (define lit? (literal-set->predicate lits-d)) + (check-equal? (lit? #'one) #t) + (check-equal? (lit? #'one 1) #t) + (check-equal? (lit? #'apple) #f))) ;; literal-set->predicate diff --git a/racket/collects/syntax/parse/private/litconv.rkt b/racket/collects/syntax/parse/private/litconv.rkt index b16740a63b..9197505856 100644 --- a/racket/collects/syntax/parse/private/litconv.rkt +++ b/racket/collects/syntax/parse/private/litconv.rkt @@ -240,15 +240,21 @@ cause an error, so don't worry about that case.) (with-syntax ([((lit phase-var) ...) (for/list ([lit (in-list lits)] #:when (lse:lit? lit)) - (list (lse:lit-external lit) (lse:lit-phase lit)))]) - #'(make-literal-set-predicate (list (list (quote-syntax lit) phase-var) ...)))))])) + (list (lse:lit-external lit) (lse:lit-phase lit)))] + [(datum-lit ...) + (for/list ([lit (in-list lits)] + #:when (lse:datum-lit? lit)) + (lse:datum-lit-external lit))]) + #'(make-literal-set-predicate (list (list (quote-syntax lit) phase-var) ...) + '(datum-lit ...)))))])) -(define (make-literal-set-predicate lits) +(define (make-literal-set-predicate lits datum-lits) (lambda (x [phase (syntax-local-phase-level)]) - (for/or ([lit (in-list lits)]) - (let ([lit-id (car lit)] - [lit-phase (cadr lit)]) - (free-identifier=? x lit-id phase lit-phase))))) + (or (for/or ([lit (in-list lits)]) + (let ([lit-id (car lit)] + [lit-phase (cadr lit)]) + (free-identifier=? x lit-id phase lit-phase))) + (and (memq (syntax-e x) datum-lits) #t)))) ;; Literal sets