2010-02-23 18 views
9

Quiero guardar datos en un archivo en mi programa elisp. Tengo una lista multidimensional que quiero guardar en un archivo, así que puedo restaurarla la próxima vez que se ejecute mi programa. ¿Cuál es la forma más fácil/mejor de hacer esto?Elisp: cómo guardar datos en un archivo?

Me doy cuenta, por supuesto, de que puedo simplemente escribir mis datos en un búfer en un formato personalizado y luego guardar el búfer, pero luego tendría que escribir una función para analizar ese formato de datos cuando quiero restaurar eso. Prefiero no tener que hacer eso.

En Python, existe el módulo Pickle que le permite "volcar" objetos en el disco y restaurarlos, muy fácilmente. ¿Hay algo similar para elisp?

Respuesta

13

Este 'dump-vars-to-file rutina va a crear algunas expresiones que pueden ser leídos por la simple evaluación de las expresiones más tarde (a través de un comando o 'load'read):

(defun dump-vars-to-file (varlist filename) 
    "simplistic dumping of variables in VARLIST to a file FILENAME" 
    (save-excursion 
    (let ((buf (find-file-noselect filename))) 
     (set-buffer buf) 
     (erase-buffer) 
     (dump varlist buf) 
     (save-buffer) 
     (kill-buffer)))) 

(defun dump (varlist buffer) 
    "insert into buffer the setq statement to recreate the variables in VARLIST" 
    (loop for var in varlist do 
     (print (list 'setq var (list 'quote (symbol-value var))) 
       buffer))) 

Estoy seguro de que me falta alguna incorporada rutina que hace un trabajo más agradable o es más flexible.

he comprobado con esta pequeña rutina:

(defun checkit() 
    (let ((a '(1 2 3 (4 5))) 
     (b '(a b c)) 
     (c (make-vector 3 'a))) 
    (dump-vars-to-file '(a b c) "/some/path/to/file.el"))) 

que produjo la salida:

(setq a (quote (1 2 3 (4 5)))) 
(setq b (quote (a b c))) 
(setq c (quote [a a a])) 

Para obtener más información, ver la página de información sobre reading and printing lisp objects

+0

Ah, una vez más, un usuario Stackoverflow muestra que este es el mejor lugar para venir para la codificación de ayuda. ¡Gracias! Pensé en un enfoque similar (usando (imprimir "% S" ...) y (eval ...) pero no sabía muy bien cómo hacerlo. – Enfors

+2

Es extraño que no haya una rutina estándar para esto. Comprueba tanto desktop.el como savehist.el y ambos usan sus propias rutinas hechas a mano ... – olejorgenb

1

Otra propuesta. En lugar de serializar llamadas setq, esta básicamente le permite usar el archivo como una variable.

(defun print-to-file (filename data) 
    (with-temp-file filename 
    (prin1 data (current-buffer)))) 

(defun read-from-file (filename) 
    (with-temp-buffer 
    (insert-file-contents filename) 
    (cl-assert (eq (point) (point-min))) 
    (read (current-buffer)))) 

Uso:

(print-to-file "bla.el" '(1 2 "foo" 'bar)) 
(1 2 "foo" (quote bar)) 

(read-from-file "bla.el") 
(1 2 "foo" (quote bar)) 
Cuestiones relacionadas