2010-02-23 17 views
9

मैं अपने elisp प्रोग्राम में एक फ़ाइल में डेटा को सहेजना चाहता हूं। मेरे पास एक बहु-आयामी सूची है जिसे मैं एक फ़ाइल में सहेजना चाहता हूं, इसलिए अगली बार जब मेरा प्रोग्राम चलता है तो मैं इसे पुनर्स्थापित कर सकता हूं। ऐसा करने का सबसे आसान/सबसे अच्छा तरीका क्या है?एलिस्प: फ़ाइल में डेटा कैसे सहेजना है?

मुझे एहसास है कि, मैं बस एक कस्टम प्रारूप में एक बफर में अपना डेटा लिख ​​सकता हूं और फिर बफर को सहेज सकता हूं, लेकिन फिर मुझे उस डेटा प्रारूप को पार्स करने के लिए एक फ़ंक्शन लिखना होगा जब मैं पुनर्स्थापित करना चाहता हूं यह। मुझे ऐसा करने की ज़रूरत नहीं है।

पायथन में, पिकल मॉड्यूल है जो आपको ऑब्जेक्ट को "डंप" करने देता है और उन्हें आसानी से बहाल करता है। क्या elisp के लिए कुछ समान है?

उत्तर

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

+0

आह, एक बार फिर से एक Stackoverflow उपयोगकर्ता से पता चलता है कि इस सबसे अच्छी जगह मदद कोडिंग के लिए आने के लिए है। धन्यवाद! मैंने खुद को एक समान दृष्टिकोण के बारे में सोचा (उपयोग (प्रिंट "% एस" ...) और (eval ...)) लेकिन मुझे नहीं पता था कि इसके बारे में कैसे जाना है। – Enfors

+2

अजीब बात है कि इसके लिए कोई मानक दिनचर्या नहीं है। डेस्कटॉप.एएल और savehist.el दोनों की जांच की और दोनों अपने हाथ से लुढ़का दिनचर्या का उपयोग करें ... – olejorgenb

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)) 
संबंधित मुद्दे