如何列出命名空间中的函数?

81

我想知道如何列出Clojure命名空间中的所有函数。我已经做了一些研究,但还没有达到目标。我已经找到了使用show方法列出Java类方法的方法:

(show java.awt.Graphics)

我想列出Clojure命名空间的函数,我已经尝试使用show方法,就像这样:

(show 'clojure.contrib.repl-utils)

这里展示了一些Java类方法,但并不包括我正在寻找的docshow等方法。如何获取它们?

4个回答

104

通常我会调用

(keys (ns-publics 'foo))

列出命名空间 foo 导出的变量;例如,对于 clojure.contrib.monads,此操作返回:

(defmonad censor m-when-not m+write+m maybe-m maybe-t ...)

(...表示有很多东西)

更一般地说,有一堆函数的名称以 ns- 开头,按命名空间列出变量,并附加某些其他条件:

  1. ns-map -- 最常用的函数,返回一个由符号(实际上是非命名空间限定符号)键入的映射,其中每个符号对应的值是给定命名空间中该符号解析为的变量或类。

  2. ns-interns -- 类似于 ns-map,但只包括在给定命名空间中内部化的变量(与从其他命名空间访问的变量相反,这是由于通过 userefer 调用或从 clojure.core 隐含引用变量)。

  3. ns-publics -- 类似于 ns-interns,但只包括非私有变量。

  4. ns-imports -- 类似于 ns-map,但只包括其值对应于 Java 类的条目。

还有 ns-aliases,它列出了可以用作其他命名空间变量缩写别名的符号;例如,如果调用 (require '[clojure.contrib.math :as math]),则 ns-aliases 将包括键为 math(符号)的条目,其值将是实际命名空间 clojure.contrib.math。这些映射未包含在 ns-map 返回的映射中。


иҝҷдәӣеҮҪж•°зҡ„еҸҜз”ЁжҖ§е’ҢdocеҮҪж•°жҳҜеҗҰжҳҜдёәж—§еә“е’Ңе…¶д»–иҪҜ件еҢ…жҸҗдҫӣж–ҮжЎЈдёҚжҳҜзү№еҲ«йҮҚиҰҒзҡ„еҺҹеӣ е‘ўпјҹ - Kenny Evitt

72

你可以使用dir命令。(也许这个命令在问题最初被提出时还不可用。)

user=> (dir clojure.string)
blank?
capitalize
escape
join
lower-case
re-quote-replacement
replace
replace-first
reverse
split
split-lines
trim
trim-newline
triml
trimr
upper-case
nil

1
请注意:在Clojure 1.4中,(dir *ns*)无法正常工作,会出现异常信息 Exception No namespace: *ns* found clojure.core/the-ns (core.clj:3691) - xealits
1
@xeslits,我相信你是对的。如果你跟随我的答案中的dir文档链接,会发现在一个角落里有一条通知,说明dir是在Clojure 1.6中引入的。当我发布答案时,也许我应该包含这些信息。此时,v.1.5已经落后于当前版本三个版本。虽然可能有人有使用1.5甚至1.4的充分理由,但我认为这种情况很少见。 - Mars
3
这与版本无关,你只需要提供名称空间的实际符号即可:在Clojure 1.8中(dir my-actual-namespace)可以正常工作,但如果我尝试(dir *ns*)则会出现“无名称空间:ns”错误。 - Radon Rosborough
3
回到这个问题和答案:注意,dir 只返回“public”变量,而 ns-map 则是针对所有内容。 - xealits

6

请看这里。更具体地说:

;; Sometimes I like to ask which public functions a namespace provides.
(defn- ns-publics-list [ns] (#(list (ns-name %) (map first (ns-publics %))) ns))

0
对于那些使用Counterclockwise的人,有一个默认显示的“命名空间浏览器”。
如果不可见,可以通过菜单选项显示:
窗口 > 显示视图 > 命名空间浏览器
官方文档: http://doc.ccw-ide.org/documentation.html#_namespace_browser_view 官方文档摘录:
命名空间浏览器视图显示活动REPL的所有命名空间的所有符号[2]。它允许您跳转到相关文件中符号的定义(包括在jar内):只需在命名空间浏览器视图中双击符号名称即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接