Elisp:如何在文件中保存数据?

时间:2010-02-23 21:34:23

标签: persistence elisp

我想将数据保存到我的elisp程序中的文件中。我有一个多维列表,我想保存到文件,所以我可以在下次程序运行时恢复它。最简单/最好的方法是什么?

我当然知道,我可以简单地将数据写入自定义格式的缓冲区,然后保存缓冲区,但是当我想要恢复它时,我必须编写一个函数来解析该数据格式。我宁愿不必这样做。

在Python中,有一个Pickle模块,可以让您将对象“转储”到磁盘并轻松恢复它们。对于elisp有类似的东西吗?

2 个答案:

答案 0 :(得分:13)

这个'dump-vars-to-file例程将创建一些表达式,可以通过以后简单地评估表达式来读取(通过'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)))

我确信我错过了一些做得更好或更灵活的内置例程。

我用这个小程序测试了它:

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

产生了输出:

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

有关详细信息,请参阅reading and printing lisp objects

上的信息页面

答案 1 :(得分:1)

另一个建议。而不是序列化setq调用,这个调用基本上允许您将文件用作变量。

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

用法:

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

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