clojure:如何列出当前名称空间中可访问的所有名称?
clojure:如何列出当前名称空间中可访问的所有名称?,clojure,namespaces,Clojure,Namespaces,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
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)
user=>(dir-user)
无
用户=>
用户=>
user=>(在ns'foo中)
#
foo=>
foo=>
foo=>(dir foo)
CompilerException java.lang.RuntimeException:无法解析此上下文中的symbol:dir,正在编译:(无源路径:17)
存在哪些其他(非公共)类型的名称/变量?(这些可能是Java类型?)如何列出这些非公开名称?启动时如何将它们导入命名空间(或某些“默认情况”命名空间)?如何在运行时搜索默认名称空间
例如,在Python中:
dir()
列出当前名称空间中的所有内容,如果未找到引用的变量,则在dir(\uuuu内置项)
中检查该变量。这个问题已经得到了回答。可以使用以下命令列出命名空间中的所有公共变量:
(keys (ns-publics 'foo))
还有一个类似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)))
编辑
如果你真的想看到士兵们,你可以:
(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名称空间”中的所有符号。此问题已得到回答。可以使用以下命令列出命名空间中的所有公共变量:
(keys (ns-publics 'foo))
还有一个类似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)))
编辑
如果你真的想看到士兵们,你可以:
(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命名空间”中的所有符号。可能重复的