2010-10-20 13 views
10

En ruby ​​frecuentemente uso File.expand_path(File.dirname(__FILE__)) para cargar archivos de configuración o archivos con datos de prueba. En este momento estoy tratando de cargar algunos archivos html para una prueba en mi aplicación clojure y no puedo entender cómo hacerlo sin tener que codificar por completo la ruta al archivo.¿Cuál es el equivalente de Clojure de __FILE__ (encontrado en Ruby & Perl)

edición: estoy usando leinigen si eso ayuda en cualquier forma

ref: __FILE__ es un especial literal que devuelve el nombre de archivo (incluyendo cualquier camino) dado al programa cuando es ejecutado. ver (rubydoc & perldata)

Respuesta

13
*file* 

API Reference (añadir *file* a la url)

+1

¿cómo se obtiene la ruta completa? – jshen

9

Aquí es una manera de replicar que en Clojure:

(defn dirname [path] 
    (.getParent (java.io.File. path))) 

(defn expand-path [path] 
    (.getCanonicalPath (java.io.File. path))) 

Luego, su línea de Rubí File.expand_path(File.dirname(__FILE__)) en Clojure haría sea ​​este:

(expand-path (dirname *file*)) 

Ver Java interop docs para .getParent & .getCanonicalPath.


NB. Creo que *file* siempre devuelve el nombre de ruta/nombre de archivo absoluto (aunque no canónico) en Clojure. Mientras que __FILE__ devuelve el nombre de ruta/nombre de archivo proporcionado en la ejecución. Sin embargo, no creo que estas diferencias afecten a lo que intentas hacer?

/I3az/

7

Ninguna de las soluciones de punto 9 es correcta. * archivo * le da un archivo relativo a la ruta de clase. El uso de .getCanonicalPath o .getAbsolutePath en * file * le dará un archivo inexistente. Como se señaló en this old thread, debe usar ClassLoader para resolver * file * correctamente. Esto es lo que utilizo para obtener el directorio padre del archivo actual:

(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent) 
0

Sobre la base de la respuesta de user83510 anteriormente, la respuesta completa es:

(def path-to-this-file 
    (clojure.string/join "/" [(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent) (last (clojure.string/split *file* #"/"))])) 

No es bonita, pero funciona: P

Cuestiones relacionadas