2010-05-18 15 views
11

Cuando quiero leer en un S-expresión almacenada en un archivo en un programa de Common Lisp correr, hago lo siguiente:Clojure: ¿Equivalente a la función de lectura de Common Lisp?

(defun load-file (filename) 
    "Loads data corresponding to a s-expression in file with name FILENAME." 
    (with-open-file (stream filename) 
    (read stream))) 

Si, por ejemplo, tengo un archivo llamado foo.txt que contiene el S -expresión (1 2 3), la función anterior devolverá esa expresión S si se llama de la siguiente manera: (load-file "foo.txt").

He estado buscando y buscando y no he encontrado una solución igualmente elegante en Clojure. ¿Algunas ideas?

Gracias!

Respuesta

8

Puede hacer, p.

(require '[clojure.contrib.io :as io]) 

(io/with-in-reader (io/file "foo.txt") (read)) 
; => (1 2 3) 

Tenga en cuenta que es probable que desee volver a enlazar a *read-eval*false primero. También tenga en cuenta que lo anterior funciona con contrib HEAD actual (y seguramente funcionará en 1.2 cuando se publique); para Clojure 1.1, la misma funcionalidad está disponible en los espacios de nombres clojure.contrib.duck-streams y clojure.contrib.java-utils.

+0

Hola, ¿cuál es la ventaja, en su caso, de este enfoque sobre (read-string (slurp "foo.txt")) – jkndrkn

+2

'slurp' /' io/slurp * 'arrastra todo el contenido del archivo, aunque' read-string' solo leerá un formulario completo y descartará el resto. El enfoque 'con-en-lector 'leerá solo un poco más allá de la primera forma (debido al almacenamiento en búfer). Además, puede tener más formularios en el cuerpo de 'con-en-lector'; en particular, las invocaciones subsecuentes de 'read' dentro del mismo formulario' with-in-reader' devolverían formularios adicionales del archivo. (Intenta usar '[(leer) (leer)]' como el cuerpo para obtener las dos formas iniciales.) Sin embargo, habría publicado tu respuesta junto a esta si hubiera pensado en ello. :-) –

Cuestiones relacionadas