【问题标题】:Get available clojure namespaces获取可用的 clojure 命名空间
【发布时间】:2026-01-09 21:40:01
【问题描述】:

有没有一种惯用的方法来获取可用的命名空间?

(all-ns) 仅返回已使用的命名空间。 (Package/getPackages) 返回所有可用于 import 的 Java 包,但仅返回那些已使用的 Clojure 命名空间。

然后我偶然发现了this post,但它使用了一些类路径魔法。

所以如果我的类路径中有 clojure.jar 和 contrib.jar,但我还没有使用任何东西,我想得到类似 ('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...) 的东西。

【问题讨论】:

    标签: clojure namespaces


    【解决方案1】:

    你需要做“类路径魔法”。由于没有注册表,您必须遍历类路径并查看每个 clojure 源文件以确定哪些名称空间可用。 (如果文件未经过 AOT 编译。否则您将需要不同的启发式方法。)

    我认为链接帖子中使用的函数是最好的方法:clojure.contrib.find-namespaces/find-namespaces-on-classpath


    自 Clojure 1.3.0 起已弃用;现在使用来自http://github.com/clojure/java.classpath的clojure.tools.namespace.find/find-namespaces 和clojure.java.classpath/classpath

    【讨论】:

      【解决方案2】:

      我发现bultitude 是一个很好的工具。

      例子:

      user=> (require '[bultitude.core :as b])
      nil
      
      user=> (take 10 (b/namespaces-on-classpath))
      (bultitude.core-test bultitude.core clojure.data clojure.string clojure.test clojure.xml clojure.inspector clojure.repl clojure.set clojure.test.junit)
      
      user=> (b/namespaces-on-classpath :prefix "bultitude")
      (bultitude.core-test bultitude.core)
      

      【讨论】:

      • 看起来与我的问题完美匹配