On Fri 4 Apr 2014 at 03:53:54PM -0800, Christopher Howard wrote: > Is there some trick Clojure command to list all functions defined in a > namespace?
I use these functions to create cheatsheets on the fly:
(defn fn-var? [v]
(let [f @v]
(or (contains? (meta v) :arglists)
(fn? f)
(instance? clojure.lang.MultiFn f))))
(defn cheat-sheet [ns]
(let [nsname (str ns)
vars (vals (ns-publics ns))
{funs true
defs false} (group-by fn-var? vars)
fmeta (map meta funs)
dmeta (map meta defs)
flen (apply max 0 (map (comp count str :name) fmeta))
dnames (map #(str nsname \/ (:name %)) dmeta)
fnames (map #(format (str "%s/%-" flen "s %s") nsname (:name %)
(string/join \space (:arglists %)))
fmeta)
lines (concat (sort dnames) (sort fnames))]
(str ";;; " nsname " {{{1\n\n"
(string/join \newline lines))))
which produces output like this:
user=> (println (cheat-sheet 'clojure.java.io))
;;; clojure.java.io {{{1
clojure.java.io/Coercions
clojure.java.io/IOFactory
clojure.java.io/default-streams-impl
clojure.java.io/as-file [x]
clojure.java.io/as-relative-path [x]
clojure.java.io/as-url [x]
clojure.java.io/copy [input output & opts]
clojure.java.io/delete-file [f & [silently]]
clojure.java.io/file [arg] [parent child] [parent child & more]
clojure.java.io/input-stream [x & opts]
clojure.java.io/make-input-stream [x opts]
clojure.java.io/make-output-stream [x opts]
clojure.java.io/make-parents [f & more]
clojure.java.io/make-reader [x opts]
clojure.java.io/make-writer [x opts]
clojure.java.io/output-stream [x & opts]
clojure.java.io/reader [x & opts]
clojure.java.io/resource [n] [n loader]
clojure.java.io/writer [x & opts]
Combine (cheat-sheet) with a regex filter on (all-ns), and presto, you
have instant, up-to-date Clojure references on command.
guns
pgpy9lPrkKL1Q.pgp
Description: PGP signature
