我想知道如何列出Clojure命名空间中的所有函数。我已经做了一些研究,但还没有达到目标。我已经找到了使用show方法列出Java类方法的方法:
(show java.awt.Graphics)
我想列出Clojure命名空间的函数,我已经尝试使用show方法,就像这样:
(show 'clojure.contrib.repl-utils)
这里展示了一些Java类方法,但并不包括我正在寻找的doc
和show
等方法。如何获取它们?
我想知道如何列出Clojure命名空间中的所有函数。我已经做了一些研究,但还没有达到目标。我已经找到了使用show方法列出Java类方法的方法:
(show java.awt.Graphics)
我想列出Clojure命名空间的函数,我已经尝试使用show方法,就像这样:
(show 'clojure.contrib.repl-utils)
这里展示了一些Java类方法,但并不包括我正在寻找的doc
和show
等方法。如何获取它们?
通常我会调用
(keys (ns-publics 'foo))
列出命名空间 foo
导出的变量;例如,对于 clojure.contrib.monads
,此操作返回:
(defmonad censor m-when-not m+write+m maybe-m maybe-t ...)
(...
表示有很多东西)
更一般地说,有一堆函数的名称以 ns-
开头,按命名空间列出变量,并附加某些其他条件:
ns-map
-- 最常用的函数,返回一个由符号(实际上是非命名空间限定符号)键入的映射,其中每个符号对应的值是给定命名空间中该符号解析为的变量或类。
ns-interns
-- 类似于 ns-map
,但只包括在给定命名空间中内部化的变量(与从其他命名空间访问的变量相反,这是由于通过 use
或 refer
调用或从 clojure.core
隐含引用变量)。
ns-publics
-- 类似于 ns-interns
,但只包括非私有变量。
ns-imports
-- 类似于 ns-map
,但只包括其值对应于 Java 类的条目。
还有 ns-aliases
,它列出了可以用作其他命名空间变量缩写别名的符号;例如,如果调用 (require '[clojure.contrib.math :as math])
,则 ns-aliases
将包括键为 math
(符号)的条目,其值将是实际命名空间 clojure.contrib.math
。这些映射未包含在 ns-map
返回的映射中。
你可以使用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
(dir *ns*)
无法正常工作,会出现异常信息 Exception No namespace: *ns* found clojure.core/the-ns (core.clj:3691)
。 - xealitsdir
文档链接,会发现在一个角落里有一条通知,说明dir
是在Clojure 1.6中引入的。当我发布答案时,也许我应该包含这些信息。此时,v.1.5已经落后于当前版本三个版本。虽然可能有人有使用1.5甚至1.4的充分理由,但我认为这种情况很少见。 - Mars(dir my-actual-namespace)
可以正常工作,但如果我尝试(dir *ns*)
则会出现“无名称空间:ns”错误。 - Radon Rosboroughdir
只返回“public”变量,而 ns-map
则是针对所有内容。 - xealits请看这里。更具体地说:
;; Sometimes I like to ask which public functions a namespace provides.
(defn- ns-publics-list [ns] (#(list (ns-name %) (map first (ns-publics %))) ns))
doc
еҮҪж•°жҳҜеҗҰжҳҜдёәж—§еә“е’Ңе…¶д»–иҪҜ件еҢ…жҸҗдҫӣж–ҮжЎЈдёҚжҳҜзү№еҲ«йҮҚиҰҒзҡ„еҺҹеӣ е‘ўпјҹ - Kenny Evitt