Nếu bạn muốn làm cho các đối tượng CLOS in chung có thể in được (in có thể đọc được), bạn sẽ làm thế nào mà không cần sử dụng gì ngoài in và đọc.Làm cho các đối tượng đóng có thể in trong lisp
11
A
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
Các vấn đề liên quan
- 1. Đối tượng đóng gói
- 2. C# - In Templated từ (các) đối tượng
- 3. Sử dụng biểu diễn __str__ cho các đối tượng in trong các thùng chứa trong Python
- 4. In các đối tượng ở Django
- 5. Sử dụng các đối tượng chung của Lisp CLOS làm khóa trong một hashtable?
- 6. In danh sách các đối tượng
- 7. Nested if in lisp
- 8. Trong Lisp chung một đại diện được in là gì?
- 9. Constructor cho đối tượng có thể gọi trong JavaScript
- 10. Javascript: Cách in các đối tượng trong Jrunscript?
- 11. Tôi làm cách nào để đóng cửa trong Emacs Lisp?
- 12. awk '{in $ 2, ",", $ 1}' trong Emacs Lisp?
- 13. Chuyển đối tượng Java vào mẫu đóng?
- 14. Có thực sự OK để làm đối tượng đóng/xử lý trong __del__?
- 15. Không thể in đối tượng BSON từ kịch bản java
- 16. các trường có thể thay đổi cho các đối tượng trong Bộ Java
- 17. python - danh sách các đối tượng có thể đọc được
- 18. Đối tượng Com trong Java, có thể?
- 19. Sử dụng id đối tượng làm băm cho các đối tượng trong Python
- 20. Trong những tình huống nào, các đối tượng WPF đóng băng có hiệu suất cao?
- 21. implicits cho các đối tượng trong Scala
- 22. Xcode 5 debugger không in các đối tượng
- 23. Làm thế nào tôi có thể thêm đối tượng javascript để đối tượng khác trong động
- 24. - Bin-đóng gói, sắp xếp thùng để đóng gói các đối tượng n
- 25. Đóng JavaScript và đối tượng này
- 26. Làm thế nào để in các thuộc tính của đối tượng stdClass trong PHP?
- 27. Có thể nghe các thay đổi đối với thuộc tính của đối tượng trong JavaScript không?
- 28. Mở rộng các thuộc tính của các đối tượng hiện có như Date in TypeScript
- 29. Bạn có thể chỉ cho tôi cách viết lại các hàm trong lisp không?
- 30. In một đối tượng đồ họa
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. –
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
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. –