diff --git a/collects/syntax/private/template-runtime.ss b/collects/syntax/private/template-runtime.ss index 809aa5e125..5270257b45 100644 --- a/collects/syntax/private/template-runtime.ss +++ b/collects/syntax/private/template-runtime.ss @@ -4,6 +4,7 @@ (provide template-map-apply) (define-struct ellipses (elem count rest) #:prefab #:omit-define-syntaxes) +(define-struct ellipses-quote (rest) #:prefab #:omit-define-syntaxes) (define-struct prefab (key fields) #:prefab #:omit-define-syntaxes) (define (stx-list->vector l) @@ -74,6 +75,8 @@ stx appended) appended)))] + [(ellipses-quote? tmap) + (loop (ellipses-quote-rest tmap) data stx local-pcons)] [(prefab? tmap) (d->s (car data) stx diff --git a/collects/syntax/template.ss b/collects/syntax/template.ss index bb35a5ccfd..77e289f9c4 100644 --- a/collects/syntax/template.ss +++ b/collects/syntax/template.ss @@ -19,10 +19,12 @@ ;; - (vector map) => template portion is a vector, ;; contents like the list in map ;; - (box map) => template portion is a box with substition -;; - #s(ellipses count map) => template portion is an ellipses-generated list -;; - #s(prefab v map) => templat portion is a prefab +;; - #s(ellipses elem count map) => template portion is an ellipses-generated list +;; - #s(ellipses-quote map) => template has a quoting ellipses +;; - #s(prefab v map) => template portion is a prefab (define-struct ellipses (elem count rest) #:prefab #:omit-define-syntaxes) +(define-struct ellipses-quote (rest) #:prefab #:omit-define-syntaxes) (define-struct prefab (key fields) #:prefab #:omit-define-syntaxes) (define (datum->syntax* stx d) @@ -36,7 +38,7 @@ (and (not in-ellipses?) (identifier? #'ellipses) (free-identifier=? #'ellipses #'(... ...))) - (loop #'expr #t)] + (make-ellipses-quote (loop #'expr #t))] [(expr ellipses . rest) (and (not in-ellipses?) (identifier? #'ellipses) @@ -108,6 +110,8 @@ (loop (ellipses-rest tmap) rest)) (cons (loop (ellipses-elem tmap) (stx-car template)) (loop (ellipses-rest tmap) rest))))] + [(ellipses-quote? tmap) + (loop (ellipses-quote-rest tmap) (stx-car (stx-cdr template)))] [(prefab? tmap) (cons (s->d template) (loop (prefab-fields tmap) @@ -149,6 +153,10 @@ (if (syntax? template) (datum->syntax* template new) new)))] + [(ellipses-quote? tmap) + (datum->syntax* template + (list (stx-car template) + (loop (ellipses-quote-rest tmap) (stx-car (stx-cdr template)))))] [(prefab? tmap) (datum->syntax* template diff --git a/collects/tests/r6rs/syntax-case.sls b/collects/tests/r6rs/syntax-case.sls index a06279347d..4241905ce6 100644 --- a/collects/tests/r6rs/syntax-case.sls +++ b/collects/tests/r6rs/syntax-case.sls @@ -209,6 +209,25 @@ (map syntax->datum #'(x ... ...))]) '(a b c)) + (test (syntax-case #'(... x) () + [a (syntax->datum #'a)]) + 'x) + (test (syntax-case #'(... ...) () + [a (syntax->datum #'a)]) + '...) + (test (syntax-case #'(... (other ...)) () + [a (syntax->datum #'a)]) + '(other ...)) + (test (syntax-case #'(1 2 3) () + [(a ...) (syntax->datum #'((a (... ...)) ...))]) + '((1 ...) (2 ...) (3 ...))) + (test (syntax-case #'(1 2 3) () + [(a b c) (syntax->datum #'(... (a ...)))]) + '(1 ...)) + (test (syntax-case #'(1 2 3) () + [(a b c) (syntax->datum #'(... (... (a) b)))]) + '(... (1) 2)) + (test (identifier? 'x) #f) (test (identifier? #'x) #t) (test (bound-identifier=? #'x #'x) #t)