Elisp: How to save data in a file?

☆樱花仙子☆ 提交于 2020-01-22 07:14:20

问题


I want to save data to a file in my elisp program. I have a multi-dimensional list that I want to save to a file, so I can restore it the next time my program runs. What's the easiest / best way to do this?

I realise, of course, that I can simply write my data to a buffer in a custom format and then save the buffer, but then I'd have to write a function to parse that data format when I want to restore it. I'd rather not have to do that.

In Python, there's the Pickle module that lets you "dump" objects to disk and restore them, very easily. Is there something similar for elisp?


回答1:


This 'dump-vars-to-file routine will create some expressions that can be read by simply evaluating the expressions later (via a 'load command or '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)))

I'm sure I'm missing some built-in routine that does a nicer job or is more flexible.

I tested it with this little 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")))

Which produced the output:

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

For more information, see the info page on reading and printing lisp objects




回答2:


Another proposal. Instead of serialising setq calls, this one basically lets you use the file as a 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))))

Usage:

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

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


来源:https://stackoverflow.com/questions/2321904/elisp-how-to-save-data-in-a-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!