2016-09-18 2 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) 

Какие другие (непубличных) типов имен/VARS существует? (Это, вероятно, типы Java?) Как перечислить эти непубличные имена? Как они импортируются в пространство имен (или в некоторые «пространства имен по умолчанию») при запуске? Как обыденные пространства имен просматриваются во время выполнения?

Например, в Python: dir() перечислены все в текущем пространстве имен, если ссылочная переменная не найдена, она отмечена среди dir(__builtins__).

ответ

3

Этот вопрос уже ответил here. Вы можете перечислить весь государственный ВАР в пространстве имен с помощью:

(keys (ns-publics 'foo)) 

Там также dir функции, как питон делает, так что вы можете сделать:

(clojure.repl/dir foo) 

EDIT

Если вы действительно хотел бы видеть и рядовых, вы могли бы сделать:

(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 имен.

Смежные вопросы