我想将数据保存到我的elisp程序中的文件中。我有一个多维列表,我想保存到文件,所以我可以在下次程序运行时恢复它。最简单/最好的方法是什么?
我当然知道,我可以简单地将数据写入自定义格式的缓冲区,然后保存缓冲区,但是当我想要恢复它时,我必须编写一个函数来解析该数据格式。我宁愿不必这样做。
在Python中,有一个Pickle模块,可以让您将对象“转储”到磁盘并轻松恢复它们。对于elisp有类似的东西吗?
答案 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))