Codex

Tutorial

This tutorial goes through the process of documenting a Lisp project with Codex.

Getting Started

First, ceate a folder named docs in your project's root directory (the same directory as the ASDF file). There, you need to create two files: manifest.lisp and manual.scr.

The manifest.lisp file is read by Codex to figure out how to generate your docs, and in your case looks like this:

(:docstring-markup-format :scriba
 :systems (:my-library)
 :documents ((:title "My Library"
              :authors ("John Q. Lisper")
              :output-format (:type :multi-html
                              :template :minima)
              :sources ("manual.scr"))))

What this tells Codex is, mainly:

  • Use Scriba to parse the docstrings.
  • Before generating the docs, load and extract docstrings from the my-library system.
  • Generate a document titled "My Library" from the manual.scr file.
  • Write the document to mutiple HTML files using the Minima template.

The manual.scr file will be fairly bare-bones for now:

@begin(section)
@title(Overview)

My library does X, Y and Z.

@end(section)

Writing with Scriba

You can find the Scriba reference here.

Inserting API Documentation

To insert documentation of some Common Lisp construct – a function, class, macro, condition, etc. – you use the cl:with-package and cl:doc macros. For instance:

@cl:with-package[name="my-app"](
@cl:doc(function my-function)
@cl:doc(macro my-macro)
)

This tells Codex to find a function named my-function and a macro named my-macro in the my-app package, and insert their API documentation. In the case of functions and macros, the only documentation that is inserted is their name, lambda list and documentation string, but other objects have more complex API documentation. For instance, classes include documentatio strings for all their slots.

The cl:doc macro takes its arguments as a space-separated list of strings in the body. The first argument is the documentation type (e.g., "function" or "class"), and the second the symbol name of the thing to insert. For methods, you can add the lambda list of the method you want to insert. For example:

@cl:with-package[name="serialize-lib"](
@cl:doc(generic serialize)
@cl:doc(method serialize (object integer) stream)
@cl:doc(method serialize (object float) stream)
@cl:doc(method serialize (object string) stream)
)

Belows is the full list of API documentation types:

  • function
  • macro
  • generic
  • method
  • variable
  • struct
  • class
  • condition
  • type
  • cfunction
  • ctype
  • cstruct
  • cunion
  • cenum
  • cbitfield

The documentation types prefixed with a 'c' refer to CFFI constructs, i.e., cfunction refers to a C function declared with CFFI's defcfun macro.

Docstrings

Codex parses documentation strings using the format you specify in the manifest with the :docstring-markup-format option. In this case, we've chosen Scriba, which means we can insert Scriba markup in docstrings. For example:

(defun download-website-text (url)
  "Downloads @cl:param(url) and strips all HTML tags."
  ...)

(defclass metal ()
  ((cost :reader cost
         :initarg cost
         :type float
         :documentation "All instances @b(must) initialize cost to a floating
         point value.")))

Linking to the CLHS

You can use the cl:spec macro to link to a part of the Common Lisp HyperSpec.

For example, the following:

@cl:spec(call-next-method)
@cl:spec(complex)

will produce links to call-next-method and complex.

Building

Finally, run (codex:document :my-system). You'll see some compilation output and a lot of lines with "Inserting documentation for...". When that's done, you can open the resulting HTML in your browser.