From fdede6f0635f5d638099df92bba07e9b29796a4f Mon Sep 17 00:00:00 2001 From: Ryan Culpepper Date: Fri, 15 Apr 2011 14:01:46 -0600 Subject: [PATCH] syntax/parse: added docs for litset #:at kw, relaxed restriction on arg --- collects/syntax/parse/private/rep.rkt | 2 +- collects/syntax/scribblings/parse/parsing.scrbl | 7 ++++++- collects/tests/stxparse/litset-phases.rkt | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/collects/syntax/parse/private/rep.rkt b/collects/syntax/parse/private/rep.rkt index 18ebfe3e3d..5dbbaec8ee 100644 --- a/collects/syntax/parse/private/rep.rkt +++ b/collects/syntax/parse/private/rep.rkt @@ -1606,7 +1606,7 @@ A syntax class is integrable if ;; litset-directive-table (define litset-directive-table - (cons (list '#:at check-identifier) + (cons (list '#:at (lambda (stx ctx) stx)) phase-directive-table)) ;; var-pattern-directive-table diff --git a/collects/syntax/scribblings/parse/parsing.scrbl b/collects/syntax/scribblings/parse/parsing.scrbl index ac05c0ae44..339724b530 100644 --- a/collects/syntax/scribblings/parse/parsing.scrbl +++ b/collects/syntax/scribblings/parse/parsing.scrbl @@ -92,13 +92,18 @@ input's binding at phase @scheme[phase-expr]. @specsubform/subs[(code:line #:literal-sets (literal-set ...)) ([literal-set literal-set-id (literal-set-id literal-set-option ...)] - [literal-set-option (code:line #:at context-id) + [literal-set-option (code:line #:at lctx) (code:line #:phase phase-expr)]) #:contracts ([phase-expr (or/c exact-integer? #f)])]{ Many literals can be declared at once via one or more @tech{literal sets}, imported with the @scheme[#:literal-sets] option. See @tech{literal sets} for more information. + +If the @racket[#:at] keyword is given, the lexical context of the +@racket[lctx] term is used to determine which identifiers in the +patterns are treated as literals; this option is useful primarily for +macros that generate @racket[syntax-parse] expressions. } @specsubform[(code:line #:conventions (conventions-id ...))]{ diff --git a/collects/tests/stxparse/litset-phases.rkt b/collects/tests/stxparse/litset-phases.rkt index 5347a04bf1..988dd56987 100644 --- a/collects/tests/stxparse/litset-phases.rkt +++ b/collects/tests/stxparse/litset-phases.rkt @@ -70,3 +70,20 @@ (tcerr "litset, phase fail" (syntax-parse #'#%app #:literal-sets (litsk) [#%app (void)])) + +;; ---- + + +(tcerr "litset, #:at" + (let () + (define-literal-set lits #:phase 0 + (define lambda)) + (define-syntax-rule (getvar var stx) + (syntax-parse stx #:literal-sets ([lits #:at here]) + [(lambda var _) #'var])) + ;; check that introduced lambda is a literal: + (check-exn exn:fail? (lambda () (getvar x #'(a b c)))) + (check-equal? (syntax->datum (getvar x #'(lambda b c))) + '(b)) + ;; check that passed lambda is not a literal, but a pattern variable: + (check-equal? (syntax->datum (getvar lambda #'(lambda b c))))))