syntax/parse: fix bug: integrated stxclass might not bind pvar to syntax
This commit is contained in:
parent
81e0f3f3d7
commit
7cc1476170
|
@ -1603,7 +1603,8 @@
|
|||
(syntax-parse body #:context full-stx
|
||||
[((~or (~seq #:mode ~! mode:mode-spec)
|
||||
(~seq #:contract ~! contract:contract-spec))
|
||||
... . rules:expr)
|
||||
...
|
||||
rule:expr ...)
|
||||
(let-values ([(name/mode mode)
|
||||
(syntax-parse #'(mode ...)
|
||||
[((name . mode)) (values #'name (syntax->list #'mode))]
|
||||
|
@ -1618,7 +1619,8 @@
|
|||
(raise-syntax-error
|
||||
syn-err-name "expected at most one contract specification"
|
||||
#f #f (syntax->list #'dups))])])
|
||||
(values name/mode mode name/ctc ctc (parse-rules #'rules)))]))
|
||||
(values name/mode mode name/ctc ctc
|
||||
(parse-rules (syntax->list #'(rule ...)))))]))
|
||||
(check-clauses full-stx syn-err-name rules #t)
|
||||
(check-arity-consistency mode contract full-stx)
|
||||
(define-values (form-name dup-names)
|
||||
|
|
|
@ -29,11 +29,11 @@
|
|||
|
||||
(define-syntax-class keyword
|
||||
#:description (quote "keyword")
|
||||
(pattern (~fail #:unless (and (syntax? this-syntax) (keyword? (syntax-e this-syntax))))))
|
||||
(pattern (~fail #:unless (keyword? (syntax-e this-syntax)))))
|
||||
|
||||
(define-syntax-class expr
|
||||
#:description (quote "expression")
|
||||
(pattern (~fail #:when (and (syntax? this-syntax) (keyword? (syntax-e this-syntax))))))
|
||||
(pattern (~fail #:when (keyword? (syntax-e this-syntax)))))
|
||||
|
||||
;; == Normal syntax classes ==
|
||||
|
||||
|
|
|
@ -415,13 +415,13 @@ Conventions:
|
|||
[#s(pat:integrated _attrs name argu predicate description)
|
||||
(with-syntax ([(name-attr ...)
|
||||
(if (identifier? #'name)
|
||||
#'([#s(attr name 0 #t) x])
|
||||
#'([#s(attr name 0 #t) x*])
|
||||
#'())])
|
||||
;; NOTE: predicate must not assume x (ie, this-syntax) is stx
|
||||
#'(if (app-argu predicate x argu)
|
||||
(let-attributes (name-attr ...) k)
|
||||
(let ([es (cons (expect:thing 'description #t) es)])
|
||||
(fail (failure pr es)))))])]))
|
||||
#'(let ([x* (datum->syntax cx x cx)])
|
||||
(if (app-argu predicate x* argu)
|
||||
(let-attributes (name-attr ...) k)
|
||||
(let ([es (cons (expect:thing 'description #t) es)])
|
||||
(fail (failure pr es))))))])]))
|
||||
|
||||
;; (disjunct ???-pattern success (pre:expr ...) (id:id ...)) : expr[Ans]
|
||||
(define-syntax (disjunct stx)
|
||||
|
|
|
@ -387,3 +387,11 @@
|
|||
#:declare b (nat> (syntax-e #'a))
|
||||
(void)]))
|
||||
|
||||
;; ---- Regression tests
|
||||
|
||||
(test-case "pvar is syntax"
|
||||
;; from clklein 9/21/2011
|
||||
(check-true (syntax-parse #'(m 1 1 2 1 2 3)
|
||||
[(_ 1 ... . after-ones:expr)
|
||||
(syntax? #'after-ones)]))
|
||||
(void))
|
||||
|
|
Loading…
Reference in New Issue
Block a user