2016-09-18 11 views
0

According to docsdirには「public」変数のみが記載されています。 確かに、それは自分自身を示していない、現在の名前空間では利用できないことがあります。他にどのような(非公開)名の種類/ VARSは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あなたは使って名前空間内のすべてのパブリックVARSを一覧表示することができます:

(keys (ns-publics 'foo)) 

あなたができるようにもdir関数は、Pythonのような存在んです:

(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の名前空間「内のすべてのシンボルを印刷するに呼び出します。

関連する問題