2012-12-19 22 views
6

私は現在の名前空間に関するデータを格納する必要があるいくつかのコードを書いています。私のコードはオントロジを生成しており、クロージャの呼び出し間に持続する必要があるURIを割り当てる必要があります。これらのURIは自動的に生成されるので、コード作成者がそれらを書くのは単なるケースではありません。clojureでは、どのようにして現在の名前空間のファイル名を取得できますか?

私は、Emacsがデータを保存する方法と同様のメカニズムを使用すると考えました。いくつかのlispフォームを生成してファイルに保存することによって、これは、クロージャーが始まり、誰もが満足しているときに評価することができます。 leningenのようなツールを使用するときの問題は、これらのファイルはルートディレクトリにあります。

私は標準のディレクトリ規約に基づいて構築できますが、データをclojureから直接取得することをお勧めします。私は、コンパイラがソース位置データをクロージャに追加することを知っています。私自身がこれにアクセスできる方法はありますか?

+0

「保存した」データをルートディレクトリに保存しない理由をさらに詳しく説明できますか?あなたはそれを読んで、クロージャから評価することができます。 –

+0

私が保存したデータは、部分的に人間が読むことができます。それは、それが指しているファイルと一緒に保管するのが私にはもっと意味があります。それと共にバージョン管理されます。 –

答えて

12

あなたは現在、実行時に実行されているコードに名前空間を探しているなら、あなたは単にclojure.core/*ns*の値を見ることができます:あなたは、A内のファイルを探しているなら

user> (defn which-ns? [] (str *ns*)) 
user> (which-ns?) 
"user" 
user> (ns user2) 
user2> (which-ns?) 
"user2" 

user> (defn foo [x] (inc x)) 
user> (meta #'foo) 
{:arglists ([x]), :ns #<Namespace user>, :name foo, :line 1, :file "NO_SOURCE_FILE"} 

あなたは評価しているので、「NO_SOURCE_FILE」は次のとおりです。VARまたは名前空間は、あなたが参照しているソースコードの場所は、VARのメタデータとして、コンパイラによって保存されていることがdefフォームを評価するとき、定義されましたフォーム入力REPLで編集しました。ソースファイルからコードを評価すると、:fileはソースファイルのパス名を指します。

+0

Hmmm。これは名前空間自体にメタデータがあるかどうか疑問に思ったが、名前空間は実際に記号を束縛しない。私はあなたが良い点を作ったと思いますが、これまで何をしていたのか、REPLでコードを実行すると失敗する可能性があります。名前空間は、たとえ見えてもファイルに直接マップされません。 –

+0

'(the-ns 'clojure.core)'を使ってシンボルから名前空間に移動できますが、nsのメタデータを取得/設定することはできますが、ソースファイルをメタデータとして追加することはできませんnsに – Alex

関連する問題