2010-06-21 23 views

Trả lời

5

Có hai phần để làm điều này, ít nhất là trong giải pháp của tôi, tuy nhiên bạn sẽ cần chức năng này (nhờ những kẻ ở cl-tỷ lệ cho điều này (cảnh báo 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")) 

Sau đó, cho việc đọc, bạn sẽ cần phải chạy đoạn mã này, trong đó thiết lập 1/2 của cú pháp đó là { 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))))) 

đối với in ấn, sử dụng

(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))))) 

A *print-readably* được khuyến khích cao khi sử dụng tất cả các phương pháp này. Ngoài ra, lưu ý rằng các mối quan hệ hình tròn chưa được kiểm tra

+3

bạn nên có một biểu diễn bên ngoài cân bằng. Hiện tại bạn có một ký tự mở, nhưng không có ký tự đóng tương ứng. Để đọc, hãy xem ví dụ READ-DELIMITED-LIST. Xem ví dụ tại http://www.lispworks.com/documentation/lw50/CLHS/Body/f_rd_del.htm. –

+0

có thể bạn đã đúng, nhưng nó phục vụ tốt cho mục đích của tôi vì có ** phải ** chính xác ** hai đối tượng sau { – krzysz00

+0

có, nhưng nó sẽ gây nhầm lẫn cho tất cả các biên tập viên. biểu thức s phải được cân bằng. Đó là một sự thay đổi đơn giản. –

Các vấn đề liên quan