8

現在の名前空間に関するデータを保存する必要があるコードを書いています。私のコードはオントロジーを生成しており、clojure の呼び出し間で保持する必要がある URI を割り当てる必要があります。これらの URI は自動的に生成されるため、コード作成者が作成するだけではありません。

Emacs がデータを保存する方法と同様のメカニズムを使用することを考えました。いくつかの Lisp フォームを生成し、それらをファイルに保存します。これらは、clojure が開始され、全員が満足したときに評価できます。leningen などのツールを使用する場合の問題は、これらのファイルがルート ディレクトリに配置されることです。

標準のディレクトリ規則に基づいてビルドすることはできますが、データは clojure から直接取得したいと考えています。コンパイラがソースの場所のデータを clojure に追加することは知っています。自分でこれにアクセスする方法はありますか?

4

1 に答える 1

18

実行時にコードが現在実行されている名前空間を探している場合は、次の値を確認するだけですclojure.core/*ns*

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

var または名前空間が定義されているファイルを探している場合、参照しているソース コードの場所は、defフォームを評価するときにコンパイラによって var のメタデータとして格納されます。

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」は、REPL に入力されたフォームを評価しているためです。ソース ファイルからコードを評価する場合、 はソース ファイル:fileのパス名を指します。

于 2012-12-19T16:48:06.397 に答える