如何列出命名空间的功能?

Sta*_*ked 66 clojure

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

(show java.awt.Graphics)
Run Code Online (Sandbox Code Playgroud)

要列出Clojure命名空间的功能,我尝试过这样的show方法:

(show 'clojure.contrib.repl-utils)
Run Code Online (Sandbox Code Playgroud)

这表明一些Java类方法,而不是我在寻找像那些doc和show.我怎么能得到那些?

Mic*_*zyk 86

我通常打电话

(keys (ns-publics 'foo))
Run Code Online (Sandbox Code Playgroud)

列出命名空间导出的Vars foo; 例如,clojure.contrib.monads这个回报

(defmonad censor m-when-not m+write+m maybe-m maybe-t ...)
Run Code Online (Sandbox Code Playgroud)

(...代表了很多).

更一般地说,有一堆函数,其名称从ns-列表Vars by namespace开始,附加了某些附加条件:

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

  2. ns-interns- 比如ns-map,但仅包括在给定命名空间中实施的Vars(而不是来自其他命名空间的Vars,这些命名空间可以从给定命名空间访问,因为来自use或refer调用Vars或隐式引用Vars)clojure.core.

  3. ns-publics- 喜欢ns-interns,但仅包括非私人Vars.

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

还有ns-aliases哪些列出符号,当从其他名称空间引用Vars时,这些符号可用作速记别名; 例如,如果您调用(require '[clojure.contrib.math :as math]),ns-aliases将包含一个带有math(符号)键的条目,其值将是实际的名称空间clojure.contrib.math.这些映射不包含在返回的映射中ns-map.


Mar*_*ars 61

你可以用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
Run Code Online (Sandbox Code Playgroud)

  • @xealits @Mars这与版本无关.你只需要提供命名空间的实际符号:`(dir my-actual-namespace)`在Clojure 1.8中正常工作,而我得到`No namespace:*ns*`错误,如果我尝试`(dir*ns*) `. (3认同)
  • 回到这个问题并再次回答:注意,[`dir`只返回"public"vars](https://clojuredocs.org/clojure.repl/dir),`ns-map`适用于所有内容. (3认同)

Boz*_*sov 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))
Run Code Online (Sandbox Code Playgroud)