2010-08-13 8 views
7

Estoy aprendiendo CL, y tengo experiencia mínima en otros idiomas. Podría alguien explicar a mí en términos sencillos lo que esto significa, sobre todo lo que "fuera" representa aquí, y cómo encaja todo:explicación de abrir-archivo en términos sencillos

(defun save-db (filename) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :supersede) 
    (with-standard-io-syntax 
     (print *db* out)))) 

Sobre todo, el bit que no entiendo es "fuera", sino una la explicación de todo sería agradable.

Gracias

Respuesta

5

a cabo es la variable de flujo unido al archivo abierto. with-open-file garantiza que el archivo esté abierto dentro del alcance y se cerró fuera del alcance, sin importar cómo salga.

+0

¿Cómo puedo obtener páginas de manual describiendo tales cosas en Linux para CL, por favor? – agd

+2

Las páginas de manual son una tradición de Unix, y Lisp proviene de una cultura muy distinta. En general, googleo "hiperespec" + (cualquier término que tenga curiosidad). – Ken

+1

O, en muchos casos puede usar el sistema de documentación integrado de Lisp: '(documentación 'foo' function)' buscará documentación para la función o macro 'foo'. Lamentablemente, esto parece estar ausente en SBCL para el caso específico de 'with-open-file'. –

1

Como una adición a ddyer, también se puede utilizar MACROEXPAND o MACROEXPAND-1 para ver qué WITH-OPEN-FILE hace:

(macroexpand '(with-open-file (out filename 
           :direction :output 
           :if-exists :supersede) 
       (with-standard-io-syntax 
       (print *db* out)))) 

nos dice

(LET ((OUT (OPEN FILENAME :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)) (#:G748 T)) 
    (UNWIND-PROTECT 
     (MULTIPLE-VALUE-PROG1 (PROGN (WITH-STANDARD-IO-SYNTAX (PRINT *DB* OUT))) 
     (SETQ #:G748 NIL)) 
    (WHEN OUT (CLOSE OUT :ABORT #:G748)))) 

Podemos ver que abrimos el archivo llamado filename y asigne esa secuencia de archivo abierto al out y haga algo. Si ocurre algo malo, UNWIND-PROTECT será CLOSE la secuencia, en caso de que no sea nil.

La variable #:G748 es un símbolo de GENSYM ed (por lo tanto, es un símbolo nuevo e ininterrumpido). Si no sale nada al escribir el archivo, configuramos #:G748 en nil.

Por lo tanto, cuando nos CLOSE la corriente, si algo salió mal #:G748 habrá T, por lo CLOSE intentará limpiar los efectos secundarios de haber creado la corriente.

Cuestiones relacionadas