Nope.
Of course a screenshot doesn't prove something's easy. How about the complete codebase needed to make the screenshot?
(ns gview
(:import (javax.swing JFrame JScrollPane JTree)))
(defn- make-node [parent obj]
(proxy [javax.swing.tree.TreeNode] []
(toString [] (pr-str obj))
(getAllowsChildren [] (coll? obj))
(getChildAt [i] (make-node this (nth (seq obj) i)))
(getChildCount [] (count obj))
(getIndex [n] -1)
(getParent [] parent)
(isLeaf [] (not (coll? obj)))))
(defn gview [obj]
(doto (JFrame.)
(add (JScrollPane. (JTree. (make-node nil obj))))
(setTitle (str "gview: " (.getName (class obj))))
(setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE)
(pack)
(setVisible true)))
With that, you've got a handy gview function you can call from the REPL whenever you want. Trying to make sense of the in-memory representation of an messy XML file? Or maybe just trying to reproduce my screenshot? Just type this at the REPL:
(gview (clojure.xml/parse "/etc/tomcat5.5/web.xml"))
Update 23 Jan 2009: Clojure has for quite a while come with a strikingly similar tool built right in:
(use 'clojure.inspector) (inspect-tree (clojure.xml/parse "/etc/tomcat5.5/web.xml"))
