anchor.diff:  
   (defclass graphviz-graph () ())
   
  +(defgeneric graphviz-standard-purpose (node)
  +  (:method ((node t)) 'graphviz-graph))
  +
   (defgeneric graphviz-successors (purpose node)
     (:method ((purpose graphviz-graph) (node t)) nil))
   
  
positive.code:                               from-id to-id
                                (graphviz-edge-plist purpose from to))))
                    (graphviz-successors purpose from))))
          (etypecase graph-roots
            (sequence (map nil #'populate-node-table graph-roots))
            (t (populate-node-table graph-roots)))
          (format stream "digraph G {~%")
          (format stream "~{  ~A=~S~%~}" (graphviz-graph-plist purpose))
          (maphash #'write-node table)
          (maphash #'write-edges table)
          (format stream "}~%")))))
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;
  ;;; example: draw the class hierarchy of the current lisp image
  
  (defclass class-hierarchy (graphviz-graph) ())
  
  (defmethod graphviz-successors ((purpose class-hierarchy) (node class))
    ;; Show only classes that are accessible in the current package and all
  
negative.code:           (finish-output stream)
            :close-stream
            (with-temporary-file (:pathname imagefile)
              (run-program (list "dot"
                                 (format nil "-T~A" *graphviz-viewer-format*)
                                 "-o"
                                 (native-namestring imagefile)
                                 (native-namestring dotfile)))
              (run-program (list *graphviz-viewer* (native-namestring imagefile))))))
      (values))
  
    ;; the actual graph drawing algorithm
    (:method (purpose graph-roots &optional stream)
      (let ((table (make-hash-table :test #'eq))
            (node-counter 0)
            (*print-case* :downcase))
        (labels
            ((populate-node-table (node)
               (unless (gethash node table)
  