Clojure:如何获取函数文档字符串?

Clojure: How to get a function docstring?

我试图在 Clojure 中仅获取函数的文档字符串,但是我遇到了几个问题,因为我发现的所有函数实际上都打印了函数签名 + 文档字符串。

因此,例如 (doc map) 实际上会打印类似的内容。


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 ...

我只对获取文档字符串感兴趣,而不是打印它,也没有它的命名空间或元数。我正在寻找的是像 (get-doc function-name) 这将 return 一个带有

的字符串

"Returns a lazy sequence consisting of the result of applying f to the ..."

这在 Clojure 中可行吗?

你可以这样做:

(:doc (meta #'map))

map本身只是一个符号,也就是一个名字。此符号解析为 var,可通过特殊形式 #'map 访问。此 var 的值是实际函数,函数的文档字符串作为元数据存储在 var.

因此,#'map 为您提供 var(这也可以使用 (var map) 完成),meta 为您提供该 var 的元数据,:doc 提取文档字符串。

有关详细信息,请查看 var, metadata, and special forms

根据 bsvingen 的回答,我们可以定义一个宏,returns 文档字符串如下:

(defmacro docstring [symbol]
  `(:doc (meta (var ~symbol))))

如果我们特别希望它是一个函数,例如与地图一起使用,您可以将其写为

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