5

我想编写一个函数来返回我的命名空间中公共函数的名称和文档字符串,如下所示:

(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))])))

当我调用(help)REPL 时,文档字符串不附带以下功能:

familiar.core=> (help)
([save-experiment ""] [load-experiment ""] [add-data ""] [help ""] ... )

但是调用(with-out-str (doc add-data))REPL 可以正常工作:

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"

这里发生了什么?

4

1 回答 1

8

doc是一个宏,因此它无法f在调用上下文中评估本地。相反,您只是简单地调用(doc f)ovr 和一遍。

解决这个问题的最简单方法是绕过doc宏,直接查看它用于生成文档的数据:vars 上的元数据。

(defn help 
  "Halp!"
  [x]
  (for [[name var] (ns-publics 'familiar.core)]
    [name (:doc (meta var))]))
于 2013-06-14T17:32:33.160 回答