我想编写一个函数来返回命名空间中公共函数的名称和文档字符串,如下所示:
(ns familiar.core
(:require [clojure.repl :refer [doc]]
...))
;; various functions with docstrings here
(defn help
"Halp!"
[]
(let [fns (keys (ns-publics 'familiar.core))]
(for [f fns]
[f (with-out-str (doc f))])))
当我在REPL中调用(help)
时,文档字符串没有附带函数:
familiar.core=> (help)
([save-experiment ""] [load-experiment ""] [add-data ""] [help ""] ... )
但是在REPL中调用(with-out-str (doc add-data))
的工作正如我所期望的那样:
familiar.core=> (with-out-str (doc add-data))
"-------------------------\nfamiliar.core/add-data\n([& coll])\n
Adds instances of variables with values at active date.\n Examp
le:\n (add-data \"mice\" 6 \"cats\" 2 \"dogs\" 0)\n"
这里发生了什么?
答案 0 :(得分:8)
doc
是一个宏,因此无法评估调用上下文中的本地f
。相反,你只是简单地调用(doc f)
ovr及以上。
解决此问题的最简单方法是绕过doc
宏,直接查看它用于生成文档的数据:vars上的元数据。
(defn help
"Halp!"
[x]
(for [[name var] (ns-publics 'familiar.core)]
[name (:doc (meta var))]))