CLIM provides a mechanism for arranging arbitrary output in a graph. The following code produces the graph shown in Figure 18.1. [annotate]
(defun graph-test (stream &optional (orientation :horizontal))
(fresh-line stream)
(macrolet ((make-node (&key name children)
`(list* ,name ,children)))
(flet ((node-name (node)
(car node))
(node-children (node)
(cdr node)))
(let* ((2a (make-node :name "2A"))
(2b (make-node :name "2B"))
(2c (make-node :name "2C"))
(1a (make-node :name "1A" :children (list 2a 2b)))
(1b (make-node :name "1B" :children (list 2b 2c)))
(root (make-node :name "0" :children (list 1a 1b))))
(format-graph-from-roots
(list root)
#'(lambda (node s)
(write-string (node-name node) s))
#'node-children
:orientation orientation
:stream stream)))))
