2012-10-02 21 views
9

*file* değişkeninin "String olarak değerlendirilmekte olan dosyanın yolunun" değeri olmalıdır. Ancak, bu özellik bazı durumlarda bozuk görünüyor. Ben lein exec kullanarak bir dosyayı çalıştırdığınızda* dosya * değişken çalışmıyor

, işler beklendiği gibi çalışır: Ben (println *file*) bir çağrı içeren bir test çalıştırdığınızda

$ cat test.clj 
(println *file*) 
$ lein exec test.clj 
/path/to/test.clj 

Oysa NO_SOURCE_PATH yerine o satırı içeren dosyanın basılır.

Bu davranışı neden görüyorum ve değerlendirilmekte olan dosyanın yol ve dosya adına nasıl güvenli bir şekilde erişebilirim?

cevap

13

*file* derlenmiş olan dosyanın yolu olarak ayarlanır, bu nedenle tüm programın sonra *file* değerinin (eval kullanılmaması kaydıyla) bakmak artık yararlıdır derlenmektedir.

test.clj örneğinizde, dosya hala derlenirken println yürütülür. *file* referansı bir teste veya işleve taşınırsa, yalnızca *file* değeri artık kullanılmayacaksa çalışma zamanında kaldırılır.

Bir seçenek, genişletildiğinde *file* değerini saklayan bir makro yazmaktır, böylece sonuç daha sonra kullanılabilir. Örneğin, bir dosya example.clj olabilir: her yerde

(defmacro source-file [] 
    *file*) 

(defn foo [x] 
    (println "Foo was defined in" (source-file) "and called with" x)) 
repl gelen Ardından

ya, (foo 42) basacaktır: Dosya source-file tanımlanır hiç önemli olmadığını

Foo was defined in /home/chouser/example.clj and called with 42 

Not sadece nerede genişletildi, bu, foo'un tanımlandığı dosyadır. Bu, foo'un source-file'un çalıştırıldığı ve source-file döndürme değerinin yalnızca bir dize olduğu zaman foo derlenmiş sürümüne dahil edildiği için çalışır. Dize, her zaman foo yürütür her zaman kullanılabilir.

Bu davranış şaşırtıcıysa, çalışma zamanında her işlevde *file* için yararlı bir değere sahip olması için ne yapılması gerektiğini düşünmeye yardımcı olabilir. Değeri, her işlev çağrısı ve geri dönüşü için, nadiren kullanılan bir özellik için önemli bir çalışma zamanı yükü için değişmek zorunda kalacaktı.

+0

Harika bir açıklama; çok teşekkürler! –

İlgili konular