Clojure :( with-out-str(doc catch))返回""

abo*_*abo 2 clojure

我想知道为什么会这样. finally并且&也以这种方式行事.哪个其他Clojure符号有这种行为,为什么?

小智 7

我相信,你已经跨过一个bug迷迷糊糊的Clojure的实现的doc影响&,catch以及finally.在当前doc实现中,这三个被特别处理,并且关联的表达式似乎缺少语法引用.

以下是一个mod to doc,它添加了语法引用并且似乎按预期工作.此函数必须放在clojure.repl命名空间中.

(defmacro doc2
  [name]
  (if-let [special-name ('{& fn, catch try, finally, try} name)]
    `(#'print-doc (#'special-doc '~special-name))
    (cond
     (special-doc-map name) `(#'print-doc (#'special-doc '~name))
     (find-ns name) `(#'print-doc (#'namespace-doc (find-ns '~name)))
     (resolve name) `(#'print-doc (meta (var ~name))))))
Run Code Online (Sandbox Code Playgroud)

(doc catch)=> {打印trydoc并返回nil}

(doc2 catch)=> {打印trydoc并返回nil}

(with-out-str (doc catch))=> {打印trydoc并返回""}

(with-out-str (doc2 catch)) => "-------------------------\ntry\n (try expr* catch-clause* finally-clause?)\nSpecial Form\n catch-clause => (catch classname name expr*)\n finally-clause => (finally expr*)\n\n Catches and handles Java exceptions.\n\n Please see http://clojure.org/special_forms#try\n"

我将在Clojure bug追踪器上追逐它.