32 lines
1.1 KiB
Scheme
32 lines
1.1 KiB
Scheme
#lang scheme/base
|
|
|
|
(require scheme/unit
|
|
(for-syntax scheme/base
|
|
mzlib/private/unit-compiletime
|
|
mzlib/private/unit-syntax))
|
|
|
|
(provide (rename-out [module-begin #%module-begin])
|
|
(except-out (all-from-out scheme/base) #%module-begin)
|
|
(all-from-out scheme/unit)
|
|
(for-syntax (all-from-out scheme/base)))
|
|
|
|
(define-for-syntax (make-name s)
|
|
(string->symbol
|
|
(string-append (regexp-replace "-sig$" (symbol->string s) "")
|
|
"^")))
|
|
|
|
(define-syntax (module-begin stx)
|
|
(parameterize ((error-syntax stx))
|
|
(with-syntax ((name (make-name (syntax-property stx 'enclosing-module-name))))
|
|
(syntax-case stx ()
|
|
((_ . x)
|
|
(with-syntax ((((reqs ...) . (body ...))
|
|
(split-requires (checked-syntax->list #'x))))
|
|
(datum->syntax
|
|
stx
|
|
(syntax-e #'(#%module-begin
|
|
reqs ...
|
|
(provide name)
|
|
(define-signature name (body ...))))
|
|
stx)))))))
|