20362f83e434de24856b2f826d89906658088609
1 (in-package :lisp-on-lines
)
3 (define-description description
())
5 (defgeneric find-description-class
(name &optional errorp
)
6 (:method
((name (eql t
)) &optional errorp
)
7 (declare (ignore errorp
))
8 (find-class 'description t
))
9 (:method
((name symbol
) &optional errorp
)
10 (or (find-class (defining-description name
) errorp
)
11 (find-description-class t
)))
12 (:method
((description description
) &optional errorp
)
13 (declare (ignore errorp
))
14 (class-of description
)))
16 (defun find-description (name)
17 (slot-value (find-description-class name
) 'instance
))
19 (defun description-attributes (description)
20 (closer-mop:class-slots
(find-description-class description
)))
22 (define-layered-function attributes
(description))
24 (define-layered-method attributes
(description)
25 (description-attributes description
))
27 ;;;!-- TODO: This is a prime candidate for optimization
28 (defun find-attribute (description attribute-name
)
29 (find attribute-name
(description-attributes description
) :key
#'attribute-name
))
31 (define-display ((description description
))
32 (format *display
* "~{~A~%~}"
35 (with-output-to-string (*display
*)
36 (display-attribute attribute
)))
37 (attributes description
))))
39 (define-layered-method description-of
(object)
40 (find-description 't
))
42 (define-layered-method description-of
((symbol symbol
))
43 (find-description 'symbol
))
45 (define-description symbol
()
46 ((identity :label
"Symbol:")
48 :function
#'symbol-name
57 (package :function
#'symbol-package
59 (function :label
"Function:"
63 (symbol-function symbol
)