2010-06-21 15 views
11

में बंद वस्तुओं को प्रिंट करने योग्य बनाएं यदि आप सामान्य लिस्प प्रिंट करने योग्य (प्रिंट पढ़ने योग्य) में CLOS ऑब्जेक्ट्स बनाना चाहते हैं, तो आप प्रिंट और पढ़ने के अलावा कुछ भी उपयोग किए बिना ऐसा करने के लिए कैसे जाते हैं।लिस्प

उत्तर

5

लेकिन आप इस समारोह (इस के लिए सीएल-प्रसार पर लोगों के लिए धन्यवाद (चेतावनी दी LLGPL)

(defun get-slots (object) 
    ;; thanks to cl-prevalence 
    #+openmcl 
    (mapcar #'ccl:slot-definition-name 
     (#-openmcl-native-threads ccl:class-instance-slots 
     #+openmcl-native-threads ccl:class-slots 
     (class-of object))) 
    #+cmu 
    (mapcar #'pcl:slot-definition-name (pcl:class-slots (class-of object))) 
    #+sbcl 
    (mapcar #'sb-pcl:slot-definition-name (sb-pcl:class-slots (class-of object))) 
    #+lispworks 
    (mapcar #'hcl:slot-definition-name (hcl:class-slots (class-of object))) 
    #+allegro 
    (mapcar #'mop:slot-definition-name (mop:class-slots (class-of object))) 
    #+sbcl 
    (mapcar #'sb-mop:slot-definition-name (sb-mop:class-slots (class-of object))) 
    #+clisp 
    (mapcar #'clos:slot-definition-name (clos:class-slots (class-of object))) 
    #-(or openmcl cmu lispworks allegro sbcl clisp) 
    (error "not yet implemented")) 

फिर आवश्यकता होगी कम से कम मेरी समाधान में यह कर, के दो हिस्से होते हैं,, पढ़ने के लिए उपयोग करते हैं, कोड के इस टुकड़े, जो वाक्य रचना जो है { type-of-object ((slot-name . slot-value) (slot-name . slot-value) ...)

(set-macro-character 
    #\{ 
    #'(lambda (str char) 
    (declare (ignore char)) 
    (let ((list (read-delimited-list #\} str t))) 
     (let ((type (first list)) 
     (list (second list))) 
     (let ((class (allocate-instance (find-class type)))) 
      (loop for i in list do 
      (setf (slot-value class (car i)) (cdr i))) 
      class))))) 

मुद्रण के लिए 1/2 सेट चलाने की आवश्यकता होगी

(defmethod print-object ((object standard-object) stream) 
    (format stream "{ ~s ~s}" (type-of object) 
     (loop for i in (get-slots object) 
    collect (cons i (slot-value object i))))) 

*print-readably* इन सभी विधियों का उपयोग करते समय अत्यधिक अनुशंसा की जाती है। साथ ही, ध्यान दें कि परिपत्र संबंध अवांछित हैं

+3

आपके पास संतुलित बाहरी प्रतिनिधित्व होना चाहिए। वर्तमान में आपके पास एक शुरुआती चरित्र है, लेकिन कोई संबंधित बंद चरित्र नहीं है। पढ़ने के लिए उदाहरण के लिए पढ़ें- सीमित-सूची। Http://www.lispworks.com/documentation/lw50/CLHS/Body/f_rd_del.htm पर उदाहरण देखें। –

+0

शायद तुम सही हो, लेकिन यह वहाँ के रूप में मेरी प्रयोजनों के लिए अच्छी तरह से कार्य करता है ** चाहिए ** हो ** बिल्कुल ** { – krzysz00

+0

के बाद दो वस्तुओं हाँ, लेकिन यह सभी संपादकों को भ्रमित करेंगे। एस-अभिव्यक्ति संतुलित होना चाहिए। वैसे भी यह एक साधारण बदलाव है। –