2012-12-19 27 views
6

Geçerli ad alanı hakkında veri depolaması gereken bazı kod yazıyorum. Kodum bir ontoloji üretiyor ve clojure çağrıları arasında kalıcı olması gereken URI'ları atamam gerekiyor. Bu URI'ler otomatik olarak üretilir, bu yüzden sadece kod yazarlarının yazdığı bir durum değildir.clojure içinde, geçerli ad alanının dosya adını nasıl alabilirim?

Emacs'in verileri depoladığı şekilde benzer bir mekanizma kullanmayı düşündüm; bazı lisp formları oluşturarak ve bunları bir dosyaya kaydederek. Bunlar, clojure başladığında ve herkes mutlu olduğunda değerlendirilebilir. Leningen gibi araçları kullanırken sorun, bu dosyalar kök dizininde sona erecek.

Standart dizin kurallarına aykırı olabilir, ancak verileri clojure'dan almayı tercih ederim; Derleyicinin clojure'a kaynak konum verilerini eklediğini biliyorum; Buna kendim erişebileceğim bir yol var mı?

+0

Kök dizinde neden "kaydedilmiş" verileri saklamak istemediğinizi daha ayrıntılı olarak açıklayabilir misiniz? Onu okuyabilir ve clojure'dan değerlendirebilirsiniz. –

+0

Kaydetmeye devam ettiğim veriler kısmen okunabilir. Bana atıfta bulunulan dosyada tutmak daha mantıklı. Onunla birlikte versiyonu olacak. –

cevap

12

kod şu anda zamanında çalıştırıldığı, ad arıyorsanız, o zaman sadece clojure.core/*ns* değerine bakabilirsiniz: Kayıtlarda arıyorsanız

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

burada a var veya ad alanı, tanımlandı o zaman def formu değerlendirir zaman var meta veri olarak derleyici tarafından saklanır bahsettiğiniz kaynak kodu yer: Eğer değerlendirerek çünkü

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" dir bir form girin REPL içinde. Bir kaynak dosyadan kodu değerlendirirseniz, :file kaynak dosyanın yol adını gösterecektir.

+0

Hmmm. Bu, isim alanının kendisinde herhangi bir meta veri olup olmadığını merak etmeme neden oldu, ancak isim alanı aslında bir sembolü değil. İyi bir noktaya sahip olmanıza rağmen - ne yaptığımı, bir REPL'de kod çalıştırırsam başarısız olma ihtimalim olduğunu düşünüyorum. Bir isim alanı, görünse bile, doğrudan bir dosyaya eşlenmez. –

+0

Bir sembolden '(the-ns 'clojure.core)' kullanarak ad alanından elde edebilirsiniz ve ns üzerinde meta verileri alabilir/ayarlayabilirsiniz ... ancak derleyici kaynak dosyayı meta veri olarak ekleyemiyor ns'e. – Alex

İlgili konular