allow empty splicing-syntax-parameterize body in a defn context (PR 10311)

svn: r15251
This commit is contained in:
Matthew Flatt 2009-06-24 13:17:17 +00:00
parent be229c2f5e
commit 7f019819e0
4 changed files with 14 additions and 7 deletions

View File

@ -11,9 +11,9 @@
(#%provide (for-syntax do-syntax-parameterize))
(define-for-syntax (do-syntax-parameterize stx let-syntaxes-id)
(define-for-syntax (do-syntax-parameterize stx let-syntaxes-id empty-body-ok?)
(syntax-case stx ()
[(_ ([id val] ...) body0 body ...)
[(_ ([id val] ...) body ...)
(let ([ids (syntax->list #'(id ...))])
(with-syntax ([(gen-id ...)
(map (lambda (id)
@ -43,7 +43,13 @@
"duplicate binding"
stx
dup)))
(unless empty-body-ok?
(when (null? (syntax-e #'(body ...)))
(raise-syntax-error
#f
"missing body expression(s)"
stx)))
(with-syntax ([let-syntaxes let-syntaxes-id])
(syntax/loc stx
(let-syntaxes ([(gen-id) (convert-renamer val)] ...)
body0 body ...)))))])))
body ...)))))])))

View File

@ -169,9 +169,9 @@
(define-syntax (splicing-syntax-parameterize stx)
(if (eq? 'expression (syntax-local-context))
;; Splicing is no help in an expression context:
(do-syntax-parameterize stx #'let-syntaxes)
(do-syntax-parameterize stx #'let-syntaxes #f)
;; Let `syntax-parameterize' check syntax, then continue
(do-syntax-parameterize stx #'ssp-let-syntaxes)))
(do-syntax-parameterize stx #'ssp-let-syntaxes #t)))
(define-syntax (ssp-let-syntaxes stx)
(syntax-case stx ()

View File

@ -31,4 +31,4 @@
gen-id))))))]))
(define-syntax (syntax-parameterize stx)
(do-syntax-parameterize stx #'let-syntaxes)))
(do-syntax-parameterize stx #'let-syntaxes #f)))

View File

@ -66,7 +66,8 @@ forms are valid in an internal-definition context. In particular,
@scheme[require] and @scheme[provide] forms cannot appear in the body
of @scheme[splicing-syntax-parameterize], even if
@scheme[splicing-syntax-parameterize] is used in a @scheme[module]
body.
body. In a definition context, the body of
@scheme[splicing-syntax-parameterize] can be empty.
@examples[
#:eval splice-eval