I made one of these before, but here's an updated version:

http://clojure.googlegroups.com/web/chart.png

The code that generated it is attached.

--Chouser

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

(def srcpath "/home/chouser/build/clojure/src/jvm/clojure/lang/")

(defn system [cmd writedata]
      (let [proc (.. java.lang.Runtime (getRuntime) (exec (into-array cmd)))
            isr  (new java.io.InputStreamReader
                      (. proc (getInputStream)) "ISO-8859-1")
            osr  (new java.io.OutputStreamWriter (. proc (getOutputStream)))
            baos (new java.io.ByteArrayOutputStream)]
        (. osr (write writedata))
        (. osr (close))
        (loop [c (. isr (read))]
          (if (neg? c)
            (do (. proc (waitFor))
                (. baos (toByteArray)))
            (do (. baos (write c))
                (recur (. isr (read))))))))

(defmacro str-for [& for-stuff]
  `(apply str (for [EMAIL PROTECTED])))

(def colorlist (cycle ["#aa0000" "#00aa00" "#0000aa" "#000000" "#888888"
                       "#008888" "#880088" "#888800"]))

(def predmap '{ISeq seq? IPersistentMap map? IPersistentVector vector?
               Symbol symbol? Keyword keyword? Var var?
               IPersistentCollection coll? IPersistentList list?
               IPersistentSet set? Number number? IFn fn?
               Associative associative? Sequential sequential?
               Sorted sorted? Reversible reversible?})

(def dotstr
  (binding [colorlist colorlist]
    (str
      "digraph {\n"
      "  rankdir=LR;\n"
      "  dpi=55;\n"
      "  nodesep=0.10;\n"
      "  node[ fontname=Helvetica ];\n"
      (str-for [file (.listFiles (java.io.File. srcpath))]
        (let [[cname ext] (.split (.getName file) "\\.")]
          (when (= ext "java")
            (set! colorlist (rest colorlist))
            (let [[color] colorlist
                  cls (Class/forName (str "clojure.lang." cname))
                  clsname (.getSimpleName cls)
                  pred (predmap (symbol clsname))
                  label (if pred (str \" clsname \\ \n pred \") clsname)
                  cljbases (filter #(= (-> % .getPackage .getName)
                                       "clojure.lang")
                                   (bases cls))]
              (when (or cljbases pred)
                (str "  " clsname " [ label=" label " color=\"" color "\" ];\n"
                     (str-for [sub cljbases]
                        (str "  " clsname " -> " (.getSimpleName sub)
                             " [ color=\"" color "\" ];\n"))))))))
      "}\n")))

(print dotstr)

(def png (system ["dot" "-Tpng"] dotstr))

(doto (new javax.swing.JFrame "Clojure Classes")
  (add (new javax.swing.JLabel (new javax.swing.ImageIcon png)))
  (setVisible true))

Reply via email to