2011-02-22 8 views
9

सबसे पहले, मैं lisp के लिए बहुत नया हूँ, इसलिए यह संभव है कि मैं बस कुछ स्पष्ट याद कर रहा हूँ। उस ने कहा, मेरे पास प्रैक्टिकल कॉमन लिस्प है जो मेरे बगल में खुला है और सीएल हाइपर स्पेक अगले टैब में खुलता है, और इस समस्या को हल करने में असमर्थ रहा है:सामान्य लिस्प: फ़ाइल से पढ़ने पर गलत पैकेज के लिए cl lnterning प्रतीकों क्यों है?

मैं एक फ़ाइल से एक पेड़ पढ़ने की कोशिश कर रहा हूं, और मूल्य आवंटित करता हूं एक कक्षा में स्लॉट्स इस कोड का उपयोग करने के लिए:

(defun load-char (file) 
    (with-open-file (in file) 
    (with-standard-io-syntax 
     (let ((chr-in (read in)) 
      (chr (make-instance 'pc))) 
     (mapcar #'(lambda (x) (setf (slot-value chr (car x)) (cdr x))) chr-in) 
     chr)))) 

जब मैं मूल रूप से एक साथ इस हैक कर लिया और सीएल-उपयोगकर्ता पैकेज सब कुछ के तहत यह भागा पूरी तरह से काम किया है - मैं अपने आप को काफी गर्व था, वास्तव में। समस्या तब शुरू हुई जब मैंने अपनी कक्षा परिभाषा और नए पैकेज में कुछ सहायक कार्यों के साथ इसे पैक किया। मैंने asdf का उपयोग करके पैकेज लोड किया, फिर मेरे आरईपीएल के सक्रिय पैकेज को बदलने के लिए (in-package :package-name) का उपयोग किया।

अब जब मैं चलाता हूं तो मुझे एक त्रुटि मिलती है जो COMMON-LISP-USER::ID (आईडी मेरे पीसी वर्ग में पहला स्लॉट है) मौजूद नहीं है, इसलिए मैंने यह देखने के लिए लिखा कि जब मैं फ़ाइल को पढ़ता हूं तो वास्तव में क्या प्राप्त हो रहा था:

(defun load-char-test (file) 
    (with-open-file (in file) 
    (with-standard-io-syntax 
     (let ((chr-in (read in)) 
      (chr (make-hash-table))) 
     (mapcar #'(lambda (x) (setf (gethash (car x) chr) (cdr x))) chr-in) 
     (maphash #'(lambda (k v) (format t "~a: ~a~%" k v)) chr) 
     chr)))) 

फिर आरईपीएल में मैं (defparameter hsh (load-char-test "/path/to/file")) करते हैं और सब कुछ त्रुटियों के बिना चला जाता है, और मेरे प्रारूप कॉल रिटर्न वास्तव में मैं क्या उम्मीद (स्लॉट: VALUE)। लेकिन जब मैं (gethash 'id hsh) करता हूं तो यह NIL NIL देता है। लेकिन, जब मैं (gethash 'common-lisp-user::id hsh) करता हूं तो यह अपेक्षित मूल्य देता है।

तो, मैं सबकुछ ठीक से पढ़ रहा हूं, लेकिन मेरी सूची में सब कुछ मुझे परिभाषित किए गए COMMON-LISP-USER पैकेज के अंतर्गत प्रशिक्षित किया जा रहा है, और मैं यह नहीं समझ सकता कि क्यों। सहायता की बहुत सराहना की जाती है।

पीएस क्षमा करें अगर यह पोस्ट अनावश्यक रूप से लंबा है, तो मैं सिर्फ यह दिखाना चाहता था कि मैंने वास्तव में इसे स्वयं समझने की कोशिश की थी। READ द्वारा बनाई

उत्तर

13

प्रतीक पैकेज कार्यावधि में है कि वर्तमान*PACKAGE* के मूल्य में प्रशिक्षु रहे हैं, न मूल्य *PACKAGE* जब कोड है कि READ कॉल परिभाषित किया गया था था। एक विकल्प, फिर, अपने रीडिंग फॉर्म को ऐसे रूप में लपेटना है जो *PACKAGE* से जुड़ा हुआ है, उदा।

(let ((*package* (find-package :package-name))) 
    ...) 
+0

क्या इसका मतलब है? http://pastebin.com/e0xmUAmp। यह अभी भी सीएल-यूजर के तहत इंटर्न कर रहा है। – oobivat

+0

@oobivat: मेरा उत्तर देखें। एलईटी के साथ मैक्रो के साथ-मानक-आईओ-सिंटैक्स के अंदर होना चाहिए। –

+0

यहां फिक्स्ड: http://pastebin.com/f0V06uzm। तेज़ उत्तरों के लिए धन्यवाद। – oobivat

10

ध्यान दें कि WITH-STANDARD-IO-SYNTAX बांधता पैकेज CL-USER चर *PACKAGE*

आपको उस पैकेज में LET का उपयोग करके उस मैक्रो के अंदर परिवर्तनीय *PACKAGE* को बांधने की आवश्यकता है।

यह भी ध्यान दें कि WITH-STANDARD-IO-SYNTAX परिवर्तनीय *READ-EVAL* से T पर बाध्य करता है। सुरक्षा कारणों से आमतौर पर ऐसा नहीं होता है जो डिफ़ॉल्ट रूप से हो सकता है। फिर, LET बाध्यकारी के माध्यम से इसे बदलें।

+0

फिक्स्ड। बहुत धन्यवाद। – oobivat

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