*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ı.
Harika bir açıklama; çok teşekkürler! –