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

Attachment: pgpy9lPrkKL1Q.pgp
Description: PGP signature

Reply via email to