2012-12-19 79 views
6

我在寫一些需要存儲關於當前命名空間的數據的代碼。我的代碼正在生成本體,我需要分配需要在clojure調用之間保持的URI。這些URI是自動生成的,所以它不僅僅是編寫代碼的作者。在clojure中,我如何獲取當前名稱空間的文件名?

我認爲使用類似Emacs存儲數據的機制;通過生成一些lisp表單並將它們保存在文件中。當clojure開始並且每個人都開心時,這些可以被評估。當使用像leningen這樣的工具時,這些文件將在根目錄中結束。

我可以根據標準的目錄約定來構建,但我更喜歡直接從clojure獲取數據;我知道編譯器將源位置數據添加到clojure;有沒有一種方法可以讓我自己訪問?

+0

你能否更詳細地解釋爲什麼你不想將「保存」的數據保存在根目錄中?你可以閱讀它並從clojure評估。 –

+0

我保存的數據將部分用於人類可讀。對我來說,保留它所指向的文件更有意義。它將與它一起版本化。 –

回答

12

如果您正在尋找該代碼當前在運行時執行的命名空間,那麼你可以簡單地看看clojure.core/*ns*值:

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

如果你正在尋找的文件,在其中一個VAR或命名空間的定義,那麼你指的是由編譯器作爲對VAR的元數據存儲時,它計算一個def形式的源代碼位置:

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將指向源文件的路徑名。

+0

嗯。這讓我想知道名稱空間本身是否有任何元數據,但名稱空間並不實際綁定符號。我認爲,儘管你已經說得很好 - 我做了什麼,如果我在REPL中運行代碼,很可能會失敗。名稱空間不會直接映射到文件,即使它看起來像。 –

+0

你可以使用'(the-ns'clojure.core)'從一個符號到一個名字空間,你可以在ns上獲得/設置元數據......但是編譯器似乎並沒有將源文件添加爲元數據到ns。 – Alex

相關問題