简体   繁体   中英

Clojure: How to get a function docstring?

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, eg for use with map, you can write it as

(defn docstring [symbol]
   (:doc (meta (resolve symbol))))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM