document scribble/srcdoc

svn: r13660

original commit: c056bcf6d1e9d2a37a77a3aa9d121afbf96698f9
This commit is contained in:
Matthew Flatt 2009-02-16 14:45:50 +00:00
parent db690297b7
commit 744dd44978
3 changed files with 155 additions and 1 deletions

View File

@ -104,7 +104,7 @@
(syntax-case stx ()
[(_ id contract names desc)
(with-syntax ([header
(syntax-case #'(contract names) (->d -> values case->)
(syntax-case #'(contract names) (->d -> ->* values case->)
[((-> ctcs ... result) (arg-names ...))
(begin
(unless (= (length (syntax->list #'(ctcs ...)))

View File

@ -35,6 +35,7 @@ starting with the @filepath{scribble.scrbl} file.
@include-section["scheme.scrbl"]
@include-section["manual.scrbl"]
@include-section["eval.scrbl"]
@include-section["srcdoc.scrbl"]
@include-section["bnf.scrbl"]
@include-section["xref.scrbl"]
@include-section["preprocessor.scrbl"]

View File

@ -0,0 +1,153 @@
#lang scribble/doc
@(require scribble/manual
"utils.ss"
(for-label scribble/srcdoc
scribble/extract
scheme/contract))
@title[#:tag "srcdoc"]{In-Source Documentation}
The @schememodname[scribble/srcdoc] and
@schememodname[scribble/extract] libraries support writing
documentation withing the documentation code along with an export
contract, similar to using @as-index{JavaDoc}. With this approach, a
single contract specification is used both for the run-time contract
and the documentation of an exported binding.
The @schememodname[scribble/srcdoc] library provides forms for
exporting a binding with associated documentation. The
@scheme[scribble/extract] library is used to pull
@scheme[scribble/srcdoc]-based documentation into a Scribble document
(perhaps for multiple libraries).
Although documentation is written with a library's implementation when
using @schememodname[scribble/srcdoc], the documentation creates no
run-time overhead for the library. Similarly, typesetting the
documentation does not require running the library. The two phases
(run time versus documentation time) are kept separate in much the
same way that the module system keeps expansion-time code separate
from run-time code.
For an example use, see the @filepath{file} collection's
@filepath{gif.ss} source file and the corresponding extraction in
@filepath{scribblings/gif.scrbl}. As that example illustrates,
prefixing the module declaration with
@verbatim[#:indent 2]{
#reader scribble/reader
}
enables the @"@"-reader, which is handy for writing documentation
expressions.
@; ----------------------------------------
@section{Source Annotations for Documentation}
@defmodule[scribble/srcdoc]
@defform[(provide/doc spec ...)]{
Like @scheme[provide] or @scheme[provide/contract], but each
@scheme[spec] uses a @deftech{documentation transformer} to describe
the exported identifier and its contract.
The currently supported @tech{documentation transformers} are
@scheme[proc-doc], @scheme[proc-doc/names], @scheme[parameter-doc],
and @scheme[thing-doc].}
@defform[(require/doc require-spec ...)]{
Like @scheme[require], but for bindings that are needed at
documentation time (and documentation-expansion time, etc.) instead of
run time (and expansion time, etc.). A @scheme[require-doc] form has
no effect on a normal use of the library; it affects only
documentation extraction.
Typically, a library that uses @schememodname[scribble/srcdoc]
includes at least @scheme[(require/doc scribble/base scribble/manual)]
to get core Scheme forms and basic Scribble functions to use in
documentation expressions.}
@defform*/subs[#:literals (-> ->* case->)
[(proc-doc/names id contract (arg-id ...) desc-expr)
(proc-doc/names id case-contract ((arg-id ...) ...) desc-expr)]
([contract (-> arg ... result)
(->* (mandatory ...) (optional ...) result)]
[case-contract (case-> (-> arg ... result) ...)])]{
When used in @scheme[provide/doc], exports @scheme[id] with the
contract described by @scheme[contract] or @scheme[case-contract],
just like using @scheme[provide/contract].
The @scheme[arg-id]s specify the names of arguments, which are not
normally written as part of a contract. They are combined with the
contract expression to generate the description of the binding in the
documentation via @scheme[defproc].
The @scheme[desc-expr] is a documentation-time expression that
produces prose to describe the exported binding---that is, the last
part of the generated @scheme[defproc], so the description can refer
to the @scheme[arg-id]s using @scheme[scheme].
The normal @scheme[require]s of the enclosing library are effectively
converted into @scheme[for-label] @scheme[require]s when generating
documentation, so that identifiers in the @scheme[contract]s are
linked to their corresponding documentation. Similarly, any binding
that is available in the run-time phase of of the enclosing library
can be referenced in documentation prose using the @scheme[scheme]
form.}
@defform/subs[#:literals (-> ->d values)
(proc-doc id contract desc-expr)
([contract (-> result)
(->d (arg ...) () (values [id result] ...))
(->d (arg ...) () [id result])
(->d (arg ...) () #:rest id rest [id result])])]{
Like @scheme[proc-doc], but supporting contract forms that embed
argument names. Only a subset of @scheme[->d] forms are currently
supported.}
@defform[(thing-doc id contract-expr dec-expr)]{
Like @scheme[proc-doc], but for an export of an arbitrary value.}
@defform[#:literals (parameter/c)
(parameter-doc id (parameter/c contract-expr) arg-id desc-expr)]{
Like @scheme[proc-doc], but for exporting a parameter.}
@; ----------------------------------------
@section{Extracting Documentation from Source}
@defmodule[scribble/extract]
@defform[(include-extracted module-path)]{
Expands to a sequence of documentation forms extracted from
@scheme[module-path], which is expected to be a module that uses
@schememodname[scribble/srcdoc].}
@defform[(provide-extracted module-path)]{
Similar to @scheme[include-extracted], but the documentation is
packaged and exported as @scheme[exported], instead of left
inline.
Use this form in combination with
@scheme[include-previously-extracted] when documentation from a single
source is to be split and typeset among multiple documentation
locations. The @scheme[provide-extracted] form extracts the
documentation once, and then @scheme[include-previously-extracted]
form extracts documentation for specific bindings as needed.}
@defform[(include-previously-extracted module-path regexp)]{
Similar to @scheme[include-extracted], but instead of referring to the
source that contains its own documentation, @scheme[module-path]
refers to a module that uses @scheme[provide-extracted]. The
@scheme[include-previously-extracted] form expands to documentation
forms for all identifiers whose string forms match @scheme[regexp].}