macro | since v0.0-2496 | clojure.repl/doc | Edit |
(doc name)
Prints documentation for the var or special form with the name name
.
(doc map)
;; Prints:
;; -------------------------
;; cljs.core/map
;; [f coll]
;; Returns a lazy sequence consisting of the result of applying f to
;; the set of first items of each coll, followed by applying f to the
;; set of second items in each coll, until any one of the colls is
;; exhausted. Any remaining items in other colls are ignored. Function
;; f should accept number-of-colls arguments. Returns a transducer when
;; no collection is provided.
;;
;;=> nil
Prints documentation for a var or special form given its name, or for a spec if given a keyword
(defmacro doc
[name]
`(print
(binding [cljs.core/*print-newline* true]
(with-out-str
~(if-let [special-name ('{& fn catch try finally try} name)]
`(doc ~special-name)
(cond
(special-doc-map name)
`(cljs.repl/print-doc (quote ~(special-doc name)))
(repl-special-doc-map name)
`(cljs.repl/print-doc (quote ~(repl-special-doc name)))
(keyword? name)
`(cljs.repl/print-doc {:spec ~name :doc (cljs.spec.alpha/describe ~name)})
(ana-api/find-ns name)
`(cljs.repl/print-doc
(quote ~(select-keys (ana-api/find-ns name) [:name :doc])))
(ana-api/resolve &env name)
`(cljs.repl/print-doc
(quote ~(let [var (ana-api/resolve &env name)
m (select-keys var
[:ns :name :doc :forms :arglists :macro :url])]
(cond-> (update-in m [:name] clojure.core/name)
(:protocol-symbol var)
(assoc :protocol true
:methods
(->> (get-in var [:protocol-info :methods])
(map (fn [[fname sigs]]
[fname {:doc (:doc
(ana-api/resolve &env
(symbol (str (:ns var)) (str fname))))
:arglists (seq sigs)}]))
(into {})))))))))))))