clojure:如何列出当前命名空间中可到达的所有名称?

时间:2016-09-18 20:05:48

标签: clojure namespaces

According to docs i仅列出“公共”变量。 实际上,它并没有显示出来,并且可能在当前命名空间中不可用:

dir

还存在哪些其他(非公开)类型的名称/变量? (这些可能是Java类型?)如何列出这些非公开名称?它们如何在启动时导入命名空间(或某些“默认情况”命名空间)?如何在运行时搜索默认名称空间?

例如在Python中:user=> (dir user) nil user=> user=> user=> (in-ns 'foo) #<Namespace foo> foo=> foo=> foo=> (dir foo) CompilerException java.lang.RuntimeException: Unable to resolve symbol: dir in this context, compiling:(NO_SOURCE_PATH:17) 列出当前命名空间中的所有内容,如果找不到引用的变量,则在dir()中检查它。

1 个答案:

答案 0 :(得分:5)

这个问题已经回答here。您可以使用以下命令列出命名空间中的所有公共变量:

(keys (ns-publics 'foo))

还有像{python一样的dir函数,所以你可以这样做:

 (clojure.repl/dir foo)

修改

如果你真的想看到私处,你可以这样做:

(defn ns-all-vars[n]
   (filter (fn[[_ v]]
             (and (instance? clojure.lang.Var v)
                  (= n (.getName (.ns v)))))
      (ns-map n)))

然后简单地调用

(println (map first (ns-all-vars 'foo)))

打印&foo foo名称空间中的所有符号。