racket/collects/r6rs/private/identifier-syntax.ss
Matthew Flatt 894ed4a809 first cut at rnrs/base-6
svn: r8678
2008-02-16 00:32:55 +00:00

32 lines
952 B
Scheme

#lang scheme/base
(require (for-syntax scheme/base)
(for-template (only-in scheme/base set!)))
(provide identifier-syntax)
(define-syntax (identifier-syntax stx)
(syntax-case stx (set!)
[(identifier-syntax template)
#'(...
(make-set!-transformer
(lambda (stx)
(syntax-case stx (set!)
[(set! . _) (raise-syntax-error
#f
"cannot assign to identifier macro"
stx)]
[(_ arg ...) #'(template arg ...)]
[_ #'template]))))]
[(identifier-syntax
[id1 template1]
[(set! id2 pat) template2])
(and (identifier? #'id1)
(identifier? #'id2))
#'(...
(make-set!-transformer
(lambda (stx)
(syntax-case stx (set!)
[(set! id2 pat) #'template2]
[(_ arg ...) #'(template1 arg ...)]
[_ #'template1]))))]))