compatibility/collects/racket/private/old-rp.rkt
Matthew Flatt 2b861d3e67 generalized `begin-for-syntax'
original commit: d3c56c9f13327d07513f8b6bf7ea0230acb7f489
2011-09-08 14:06:00 -06:00

65 lines
2.2 KiB
Racket

(module old-rp '#%kernel
(#%require (for-syntax '#%kernel "stx.rkt" "small-scheme.rkt" "stxcase-scheme.rkt"))
(#%provide require require-for-syntax require-for-template require-for-label
provide provide-for-syntax provide-for-label)
(begin-for-syntax
(define-values (rebuild-elem)
(lambda (stx elem sub pos loop ids)
;; For sub-forms, we loop and reconstruct:
(for-each (lambda (id)
(unless (identifier? id)
(raise-syntax-error
#f
"expected an identifier"
stx
id)))
(syntax->list ids))
(let rloop ([elem elem][pos pos])
(if (syntax? elem)
(datum->syntax elem
(rloop (syntax-e elem) pos)
elem
elem)
(if (zero? pos)
(cons (loop (car elem))
(cdr elem))
(cons (car elem)
(rloop (cdr elem) (sub1 pos)))))))))
(define-syntaxes (require require-for-syntax require-for-template require-for-label)
(let ([mk
(lambda (for-stx)
(lambda (stx)
(syntax-case stx ()
[(_ elem ...)
(if for-stx
(with-syntax ([for for-stx])
(syntax/loc stx
(#%require (for-meta for (just-meta 0 elem ...)))))
(syntax/loc stx
(#%require elem ...)))])))])
(values (mk #f)
(mk #'1)
(mk #'-1)
(mk #'#f))))
(define-syntaxes (provide provide-for-syntax provide-for-label)
(let ([mk
(lambda (for-stx)
(lambda (stx)
(syntax-case stx ()
[(_ elem ...)
(if for-stx
(with-syntax ([for for-stx])
(syntax/loc stx
(#%provide (for elem ...))))
(syntax/loc stx
(#%provide elem ...)))])))])
(values (mk #f)
(mk #'for-syntax)
(mk #'for-label)))))