2016-09-18 106 views
0

According to docsdir仅列出“公共”变量。 事实上,它并不显示本身,而在当前的命名空间可能不可用:clojure:如何列出在当前命名空间中可访问的所有名称?

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

回答

3

此问题已回答here。你可以通过遍历命名空间中的所有公共瓦尔:

(keys (ns-publics 'foo)) 

还有像蟒蛇做了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))) 

要打印的所有符号在“富命名空间。

相关问题