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

我只想让文档字符串不打印它,也不让它具有名称空间或Arity。 我正在寻找的是像
(get-doc function-name)会返回一个带有

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

Clojure有可能吗?


你可以这样做:

1
(:doc (meta #'map))

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

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

有关更多信息,请查看var,元数据和特殊形式。


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

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

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

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