我想知道为什么这是。 finally
和&
也以这种方式行事。其他哪些Clojure符号具有此行为,为什么?
我相信您已经偶然发现了Clojure实现的doc
的错误,该错误影响了&
,catch
和finally
。在当前的doc
实现中,这三个是专门处理的,并且相关的表达式似乎缺少语法报价。
以下是添加语法报价的文档的mod,并且似乎按预期工作。此功能必须放置在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))))))
(doc catch)
=> {prints try
doc并返回nil}
(doc2 catch)
=> {prints try
doc and返回nil}
(with-out-str (doc catch))
=> {prints try
doc并返回 ""
}
(with-out-str (doc2 catch))
=> "-------------------------ntryn (try expr* catch-clause* finally-clause?)nSpecial Formn catch-clause => (catch classname name expr*)n finally-clause => (finally expr*)nn Catches and handles Java exceptions.nn Please see http://clojure.org/special_forms#tryn"
我将在Clojure错误跟踪器上追逐。