【问题标题】:clojure: how to list all names reachable in current namespace?clojure:如何列出当前命名空间中所有可访问的名称?
【发布时间】:2016-09-18 20:05:48
【问题描述】:

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

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)

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

例如在 Python 中:dir() 列出当前命名空间中的所有内容,如果未找到引用的变量,则在 dir(__builtins__) 中进行检查。

【问题讨论】:

标签: clojure namespaces


【解决方案1】:

这个问题已经回答了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 命名空间中的所有符号。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2014-12-11
    • 2015-05-25
    • 1970-01-01
    • 2016-06-04
    • 2013-06-26
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多