hyper-literate/collects/scribble/private/manual-mod.ss
Matthew Flatt 5a7821c879 split scribble/manual module into smaller modules
svn: r12150

original commit: ea659ba286fc5c1fda44a89d10c137473e46e8da
2008-10-28 01:40:51 +00:00

102 lines
3.3 KiB
Scheme

#lang scheme/base
(require "../decode.ss"
"../struct.ss"
"../basic.ss"
"../manual-struct.ss"
"manual-ex.ss"
"manual-style.ss"
"manual-scheme.ss"
scheme/string
scheme/list
(for-syntax scheme/base)
(for-label scheme/base))
(provide defmodule defmodule* defmodulelang defmodulelang*
defmodule*/no-declare defmodulelang*/no-declare
declare-exporting)
(define spacer (hspace 1))
(define-syntax-rule (defmodule*/no-declare (name ...) . content)
(*defmodule (list (schememodname name) ...)
#f
(list . content)))
(define-syntax defmodule*
(syntax-rules ()
[(_ (name ...) #:use-sources (pname ...) . content)
(begin (declare-exporting name ... #:use-sources (pname ...))
(defmodule*/no-declare (name ...) . content))]
[(_ (name ...) . content)
(defmodule* (name ...) #:use-sources () . content)]))
(define-syntax-rule (defmodule name . content)
(defmodule* (name) . content))
(define-syntax-rule (defmodulelang*/no-declare (lang ...) . content)
(*defmodule (list (schememodname lang) ...) #t (list . content)))
(define-syntax defmodulelang*
(syntax-rules ()
[(_ (name ...) #:use-sources (pname ...) . content)
(begin (declare-exporting name ... #:use-sources (pname ...))
(defmodulelang*/no-declare (name ...) . content))]
[(_ (name ...) . content)
(defmodulelang* (name ...) #:use-sources () . content)]))
(define-syntax-rule (defmodulelang lang . content)
(defmodulelang* (lang) . content))
(define (*defmodule names lang? content)
(make-splice
(cons
(make-table
"defmodule"
(map
(lambda (name)
(list
(make-flow
(list
(make-omitable-paragraph
(cons
spacer
(if lang?
(list (hash-lang) spacer (make-defschememodname name))
(list (scheme (require #,(make-defschememodname name)))))))))))
names))
(append (map (lambda (name)
(make-part-tag-decl `(mod-path ,(element->string name))))
names)
(flow-paragraphs (decode-flow content))))))
(define (make-defschememodname mn)
(let ([name-str (element->string mn)])
(make-index-element #f
(list mn)
`(mod-path ,name-str)
(list name-str)
(list mn)
(make-module-path-index-desc))))
(define-syntax (declare-exporting stx)
(syntax-case stx ()
[(_ lib ... #:use-sources (plib ...))
(let ([libs (syntax->list #'(lib ... plib ...))])
(for ([l libs])
(unless (module-path? (syntax->datum l))
(raise-syntax-error #f "not a module path" stx l)))
(when (null? libs)
(raise-syntax-error #f "need at least one module path" stx))
#'(*declare-exporting '(lib ...) '(plib ...)))]
[(_ lib ...) #'(*declare-exporting '(lib ...) '())]))
(define (*declare-exporting libs source-libs)
(make-splice
(list
(make-part-collect-decl
(make-collect-element
#f null
(lambda (ri) (collect-put! ri '(exporting-libraries #f) libs))))
(make-part-collect-decl
(make-exporting-libraries #f null (and (pair? libs) libs) source-libs)))))