Elisp: Как сохранить данные в файл? - PullRequest
12 голосов
/ 24 февраля 2010

Я хочу сохранить данные в файл в моей программе elisp. У меня есть многомерный список, который я хочу сохранить в файл, чтобы я мог восстановить его при следующем запуске моей программы. Какой самый простой / лучший способ сделать это?

Я, конечно, понимаю, что могу просто записать свои данные в буфер в произвольном формате и затем сохранить буфер, но тогда мне придется написать функцию для анализа этого формата данных, когда я хочу восстановить его , Я бы предпочел не делать этого.

В Python есть модуль Pickle, который позволяет вам "сбрасывать" объекты на диск и восстанавливать их очень легко. Есть ли что-то похожее на elisp?

Ответы [ 2 ]

14 голосов
/ 24 февраля 2010

Эта подпрограмма '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]))

Подробнее см. На информационной странице чтение и печать объектов lisp

2 голосов
/ 29 июня 2017

Еще одно предложение. Вместо сериализации вызовов 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))
...