
One problem involved context that should not be included in a generated submodule, while another one was an issue with the previous repair to the shift to label phase.
54 lines
2.0 KiB
Racket
54 lines
2.0 KiB
Racket
#lang racket/base
|
|
(require (for-syntax racket/base))
|
|
|
|
(provide include-extracted
|
|
provide-extracted
|
|
include-previously-extracted)
|
|
|
|
(define-for-syntax (do-include-extracted stx wraps)
|
|
(syntax-case stx ()
|
|
[(_ module-path)
|
|
(with-syntax ([get-docs (syntax-local-lift-require
|
|
#`(only (submod #,@(syntax-case #'module-path (submod)
|
|
[(submod e ...) #'(e ...)]
|
|
[e #'(e)])
|
|
srcdoc)
|
|
get-docs)
|
|
#'get-docs)]
|
|
[(wrap ...) wraps])
|
|
#'(begin
|
|
(define-syntax (docs stx)
|
|
(define docs (get-docs))
|
|
(if (identifier? docs)
|
|
;; normal:
|
|
(with-syntax ([(_ xwrap (... ...)) stx]
|
|
[id docs])
|
|
#'(xwrap (... ...) id))
|
|
;; delayed:
|
|
(with-syntax ([(_ xwrap (... ...)) stx]
|
|
[(reqs exprs ((id d) (... ...))) (syntax-local-introduce
|
|
(datum->syntax #f (get-docs)))])
|
|
#`(begin
|
|
(require . reqs)
|
|
(begin . exprs)
|
|
(xwrap (... ...) (list (cons 'id d) (... ...)))))))
|
|
(docs wrap ...)))]))
|
|
|
|
(define-syntax (include-extracted stx)
|
|
(do-include-extracted stx #'(map cdr)))
|
|
|
|
(define-syntax (provide-extracted stx)
|
|
(syntax-case stx ()
|
|
[(_ module-path)
|
|
#`(begin
|
|
#,(do-include-extracted stx #'(define exported))
|
|
(provide exported))]))
|
|
|
|
(define-syntax-rule (include-previously-extracted module-path regexp)
|
|
(let ()
|
|
(local-require (rename-in module-path [exported exported]))
|
|
(for/list ([p (in-list exported)]
|
|
#:when (regexp-match regexp (symbol->string (car p))))
|
|
(cdr p))))
|
|
|