Ravenbrook Chart implements layout and interactive display of large, complex graphs. It has previously been deployed in mature applications and as a free web service to visualise graphs.

It is now available free of charge for download, as a permissively licensed Windows library.

Although written in Lisp, the target audience for Chart is much broader. (It just has to be. There aren't that many lispers with graph-drawing needs.) So it's released as a DLL and all the examples are in Python and C.

Preparing a mature Lisp program for release as a language-neutral library has been most instructive. I'm hoping to spawn off a toolkit to make the process simpler for others following this path: a bunch of Lisp macros, shared memory strategies, tests, and templates for generating documentation and the Python & C examples. I'm thinking of calling it CL-AUDIENCE — the Common Lisp Audience expander. Alas, but its use might be confined to those rather few lisps which support saving the image as a library (rather than as an executable).

A brief example of one of these macros in play. The external function graph-nodes takes a graph and returns an array of its nodes. All the argument unmarshalling, checking and marshalling, the foreign name translation, memory management, error handlers — everything that really matters and I never want to see — is hidden. (I'm not sure I should show you the C side of calling this. It's not pretty.)

(defun-external (graph-nodes :result-type (array object)) ((graph graph)) (chart:graph-nodes graph))

It took longer than I care to admit, to bundle Chart up for publication. Doing things carefully takes time. I went for a properly designed API and comprehensive documentation, etc., rather than exposing all of Chart's features. Whether or not I do any more work on this depends on the response I get. In the meantime, I'm looking for work that pays. Anyone know of anything?