I am trying to get ONLY the docstring of a function in Clojure, nevertheless I have encountered several problems as all the functions that I find actually print the function signature + docstring.
So for example (doc map)
will actually print something like.
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
Returns a lazy sequence consisting of the result of applying f to the ...
I am only interested in getting the docstring not printing it nor having its namespace or arity. What I am looking for is something like
(get-doc function-name)
which would return a string with
"Returns a lazy sequence consisting of the result of applying f to the ..."
Is this possible in Clojure?
You can do this:
(:doc (meta #'map))
map
itself is just a symbol, that is, a name. This symbol resolves to a var, which is accessed by the special form #'map
. The value of this var is the actual function, and the docstring for the function is stored as metadata on the var.
Therefore, #'map
gives you the var (this can also be done using (var map)
), meta
gives you the metadata for that var, and :doc
extracts the docstring.
For more information, have a look at var, metadata, and special forms.
Based bsvingen's answer we can define a macro which returns the docstring like:
(defmacro docstring [symbol]
`(:doc (meta (var ~symbol))))
If we specifically want it to be a function, e.g. for use with map, you can write it as
(defn docstring [symbol]
(:doc (meta (resolve symbol))))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With