2010-08-13 10 views
7

मैं सीएल सीख रहा हूं, और मेरे पास अन्य भाषाओं में न्यूनतम अनुभव है। किसी आम आदमी के संदर्भ में मेरे लिए समझा सकते हैं क्या मतलब है इस, विशेष रूप से क्या "बाहर" यहाँ का प्रतिनिधित्व करता है, और यह सब कैसे फिट बैठता है:लेमन शर्तों में खुली फ़ाइल स्पष्टीकरण

(defun save-db (filename) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :supersede) 
    (with-standard-io-syntax 
     (print *db* out)))) 

ज्यादातर बिट मुझे समझ नहीं आता "बाहर" है, लेकिन एक पूरी बात का स्पष्टीकरण अच्छा होगा।

धन्यवाद

उत्तर

5

बाहर स्ट्रीम फ़ाइल खुली फ़ाइल से जुड़ा हुआ है। ओपन-फाइल गारंटी देता है कि फ़ाइल दायरे के अंदर खुली है, और दायरे के बाहर बंद है, भले ही आप कैसे बाहर निकलें।

+0

कृपया सीएल के लिए लिनक्स पर ऐसी चीजों का वर्णन करने वाले मैनपेज कैसे प्राप्त कर सकते हैं? – agd

+2

मैनपेज एक यूनिक्स परंपरा है, और लिस्प एक बहुत ही विशिष्ट संस्कृति से आता है। आम तौर पर, मैं "हाइपरस्पेक" + (जो भी शब्द मैं उत्सुक हूं) Google। – Ken

+1

या, कई मामलों में आप लिस्प के अंतर्निहित दस्तावेज़ सिस्टम का उपयोग कर सकते हैं: '(दस्तावेज़ीकरण' foo 'फ़ंक्शन)' फ़ंक्शन या मैक्रो 'foo' के लिए दस्तावेज़ देखेंगे। अफसोस की बात है, एसबीसीएल में 'ओपन-फाइल' के विशिष्ट मामले के लिए ऐसा लगता है। –

1

एक अतिरिक्त के रूप में ddyer लिए, आप भी MACROEXPAND या MACROEXPAND-1 उपयोग कर सकते हैं देखने के लिए क्या WITH-OPEN-FILE करता है:

(macroexpand '(with-open-file (out filename 
           :direction :output 
           :if-exists :supersede) 
       (with-standard-io-syntax 
       (print *db* out)))) 

हमें

(LET ((OUT (OPEN FILENAME :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)) (#:G748 T)) 
    (UNWIND-PROTECT 
     (MULTIPLE-VALUE-PROG1 (PROGN (WITH-STANDARD-IO-SYNTAX (PRINT *DB* OUT))) 
     (SETQ #:G748 NIL)) 
    (WHEN OUT (CLOSE OUT :ABORT #:G748)))) 

बताता हम देख सकते हैं कि हम बुलाया फ़ाइल को खोलने filename और उस खुली फ़ाइल स्ट्रीम को out पर असाइन करें, और कुछ करें। कुछ बुरा होना चाहिए, UNWIND-PROTECTCLOSE स्ट्रीम होगा, यह गैर-nil होना चाहिए।

#:G748 परिवर्तनीय GENSYM एड प्रतीक है (इसलिए यह एक ताजा, अनियंत्रित, प्रतीक है)। अगर फ़ाइल को गलत लिखने में कुछ भी गलत नहीं होता है, तो हम #:G748 से nil पर सेट करते हैं।

प्रकार, जब हम धारा CLOSE, अगर कुछ गलत हो गया #:G748T होंगे, इसलिए CLOSE धारा का निर्माण किया होने का कोई साइड इफेक्ट को साफ करने का प्रयास करेंगे।

संबंधित मुद्दे