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

标签 clojure namespaces

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

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__) 中进行检查。

最佳答案

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

(keys (ns-publics 'foo))

还有一个dir像 python 一样的功能,所以你可以这样做:

 (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 命名空间中的所有符号。

关于clojure:如何列出当前命名空间中可访问的所有名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562153/

相关文章:

clojure - 在提议使用新语言之前要回答的问题?

php - PHP 中带有命名空间的变量函数

design-patterns - Clojure 中的财务账户模式实现 : ref or agent?

shell - clojure 中的 "inferior"进程 - 重定向异步输出以进行进一步处理

xml - clojure 从 xsd 生成 xml 和 xpath

c++ - 是否可以使用在没有命名空间的命名空间中声明的类名::

c - 避免与 C (C99) 中的枚举发生名称冲突

c# - 如何跨越多个程序集的 C# 命名空间?

php - 命名空间无法正确解析

architecture - clojure 中协议(protocol)/多方法的环境依赖调度