You are looking at historical revision 39456 of this page. It may differ significantly from its current revision.

chalk

Simple hahn-style in-source documentation

Introduction

Chalk attempts to be a simpler alternative to Chicken 4's hahn + hahn-utils, generating wiki output with support for procedure, variables, syntax, modules, include files, and egg files. It tries to be as basic as possible, performing almost no code analysis and no evaluation, while making it easy to generate documentation from one or more files.

The following is hahn's fibonacci example, rewritten for chalk. Note key differences: The example is simply a string (and therefore not evaluated), whith the option of a @pre or @post caption. Additionally, the docstring must be contained within a single string and a heading is not generated for the procedure name.

(define (fibonacci n)
  @("Computes the nth [[http://en.wikipedia.org/wiki/Fibonacci_number|Fibonacci]].
This naïve algorithm runs in ''O(2^n)''; using e.g. memoization, we could bring
it down to ''O(n)''."
    (n "The nth number to calculate")
    (@to "integer")
    (@example
     (@pre "For example, computing the 6th Fibonnaci number (starting from 0)")
     "(fibonacci 6) ; => 8"))
  (case n
    ((0) 0)
    ((1) 1)
    (else (+ (fibonacci (- n 1))
             (fibonacci (- n 2))))))

Which produces the following wiki output:

[procedure] (fibonacci n) → integer

Computes the nth Fibonacci. This naïve algorithm runs in O(2^n); using e.g. memoization, we could bring it down to O(n).

n
The nth number to calculate

For example, computing the 6th Fibonnaci number (starting from 0)

(fibonacci 6) ; => 8

Syntax

Most expressions of the following form can be documented to varying degrees of automation, where SIGNATURE can be a pair (as in a procedure definition).

(DEFINE SIGNATURE BODY ...)

Documentation entails inserting a docexpr of the following form before the BODY.

@("Description" [OPTION] ...)

Variables

Variables are documented as follows, ignoring potentially disastrous rounding practices:

(define pi @("The ratio of a circle's circumference to its diameter.") 3.14)

The special tag @internal can be used to suppress output, and is useful for documenting unexported variables internally:

(define counter
  @("How many times thing has happened."
    (@internal)))

Procedures

Procedures are documented similarly, but can contain the tags, @to, and @example, as well as listing function parameters:

(define (foobar a b)
  @("Does baz."
    (a "An input")
    (b "Another input")
    (@to integer)
    (@example
     (@pre "For example, to do baz with foobar:")
     "(foobar blarg arg) ; => 4"))
  (baz))

In the case of procedures defined as variables, chalk considers it a variable by default, using the function name as a signature. In either case, you can override the default signature with the tag @sig, and you can specify that it is indeed a procedure as follows:

(define function?
  @(fn "This is definitely a function"
       (@sig (function? a b c))))

You can specify that a variable definition is a procedure with any of fn, proc, function, or procedure in the first position of the docexpr.

Tags behave as follows:

@to
A string or expression to be inserted as {{→ expr}}
@example
A string to be enscripted with scheme highlighting, with optional @pre or @post caption.
@sig
A string or expression that override the procedure signature
@internal
Suppress output, documented for internal use.

Syntax

Syntax accepts the same tags and is defined equivalently to procedures, provided that it is is defined using define-syntax. The @sig tag is especially useful for specifying syntax usage, since chalk won't automatically detect the signature. Here's a rather silly example:

(define-syntax hello
  @("Hello there!"
    (@sig (hello a b c)))
  (syntax-rules ()
    ((_ a b c)
     "Hello there!")))

For syntax defined otherwise, you can specify that it is syntax like so:

(define-syntax-rule (hello a b c)
  @(syntax "Hello")
  "Hello there")

You can specify that a definition is syntax with either syntax or macro in the first position of the docexpr.

Records

Currently, two types of record definitions are supported - define-record and define-record-type from chicken.base. Records can be documented internally by specifying a @internal file, and they accept one more tag @full. When specified, it generates a list of all of the procedures associated with that record definition. Otherwise, only the record name is documented, and procedure documentation can be added manually.

For example:

(define-record point
  @("A point"
    (@full))
  x y)

Produces the following output:

[record] point
[procedure] (make-point x y)
[procedure] point?
[procedure] point-x
[procedure] point-y

A point

Top-level documentation

A docexpr outside of a definition can be used to insert arbitrary text. Additionally, the following top-level tags are supported:

script
Generate an enscript segment, with optional highlight tag. Can contain multiple strings.
@(script
  (@highlight "scheme")
  "(print \"hello\")"
  "(print 4)")

In addition to the @highlight tag, a caption can be inserted before or after a script using the tags @pre and @post.

heading, title, ==
A title
@(== "My egg")

Various subheadings:

subheading, subtitle, ===
subsubheading, subsubtitle, ====
subsubsubsubheading, subsubsubsubtitle, =====
deflist
A definition list such as this one
@(deflist
   (key "value")
   (definitionless-term)
   (term "definition"))

Lists and tables are not currently supported, but are planned for the future. In the meantime, unsupported forms of wiki syntax can be inserted literally using a top-level docexpr.

Compiling and running programs

To compile a scheme file containing chalk special syntax, you can use -X chalk. For script usage (e.g. with csi -s), you can use import chalk.

Chalk program usage

The chalk program generates output to stdout or a specified output file based on the given input file(s), and optionally: a .egg file, a .release-info file, and/or a LICENSE file. For more info, see chalk --help:

Usage: chalk [OPTION]... [FILE]...
 -h, --help               Print usage
 -o, --output=FILE        Write to file
 -i, --ignore-egg         Ignore .egg file
 -r, --ignore-release     Ignore .release-info file
 -n, --no-toc             Don't add a toc
 -e, --email=EMAIL        Include EMAIL with author
 -H, --head=FILE          File to add to beginning of documentation
 -P, --prologue=FILE      File to add after synopsis
 -E, --epilogue=FILE      File to add before maintainer info
 -T, --tail=FILE          File to add to end of documentation
 -L, --license[=FILE]     Whether to insert a license
 -m, --module-headers     Create === Module-name headers
 

A .release-info file can contain optional comments following release expressions (on the same line), which are used as version descriptions when generating a version history section of the documentation, for example:

(uri targz "https://example-url.com")
(release "0.3.1") ; Fixes bug
(release "0.3.0") ; Adds feature
(release "0.2.0")
(release "0.1.0") ; Initial version

Full Example

Coming soon

Author

Diego A. Mundo

Version History

0.3.2
Add multi-line script support
0.3.1
Fix bug: release-info not ignored on ignore-egg
0.3.0
Add support for records and syntax
0.2.0
Add @example, listed function parameters, script caption
0.1.0
Initial version