2010-02-23 10 views
9

Je veux enregistrer des données dans un fichier de mon programme elisp. J'ai une liste multi-dimensionnelle que je veux enregistrer dans un fichier, donc je peux le restaurer la prochaine fois que mon programme s'exécutera. Quelle est la meilleure façon de faire cela?Elisp: Comment enregistrer les données dans un fichier?

Je réalise, bien sûr, que je peux simplement écrire mes données dans un tampon dans un format personnalisé, puis enregistrer le tampon, mais alors je devrais écrire une fonction pour analyser ce format de données quand je veux restaurer il. Je préférerais ne pas avoir à faire ça.

En Python, il y a le module Pickle qui vous permet de "vider" des objets sur le disque et de les restaurer, très facilement. Y a-t-il quelque chose de similaire pour Elisp?

Répondre

13

Cette routine "dump-vars-to-file va créer des expressions qui peuvent être lues en évaluant simplement les expressions plus tard (via une commande 'load ou '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))) 

Je suis sûr que je manque un peu intégré routine qui fait un meilleur travail ou est plus flexible.

Je l'ai testé avec cette petite routine:

(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"))) 

qui a produit la sortie:

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

Pour plus d'informations, consultez la page d'information sur reading and printing lisp objects

+0

Ah, encore une fois un utilisateur Stackoverflow montre que c'est le meilleur endroit pour venir pour le codage de l'aide. Merci! J'ai pensé à une approche similaire moi-même (en utilisant (print "% S" ...) et (eval ...)) mais je ne savais pas trop comment faire. – Enfors

+2

Étrange qu'il n'y a pas de routine standard pour cela. Vérifié à la fois desktop.el et savehist.el et les deux utilisent leurs propres routines roulées à la main ... – olejorgenb

1

Une autre proposition. Au lieu de sérialiser les appels setq, celui-ci vous permet essentiellement d'utiliser le fichier en tant que 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)))) 

Utilisation:

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

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