1 (in-package :lisp-on-lines
)
3 (define-layered-function description-of
(thing)
5 (find-description 't
)))
7 (defun description-print-name (description)
8 (description-class-name (class-of description
)))
10 (defun find-attribute (description attribute-name
)
11 (slot-value description attribute-name
))
14 (defun description-attributes (description)
16 #'slot-value-using-class
17 (class-of 'description
)
19 (class-slots (class-of description
))))
21 (defvar *display-attributes
* nil
)
22 (defun attribute-active-p (attribute)
23 (or (null *display-attributes
*)
24 (find (attribute-name attribute
) *display-attributes
*)))
26 (define-layered-function attributes
(description)
27 (:method
(description)
30 (and (attribute-active-p attribute
)
31 (some #'layer-active-p
33 (slot-definition-layers
34 (attribute-effective-attribute-definition attribute
))))))
35 (description-attributes description
))))
39 (defmacro define-description
(name &optional superdescriptions
&body options
)
40 (let ((description-name (defining-description name
)))
41 (destructuring-bind (&optional slots
&rest options
) options
42 (let ((description-layers (cdr (assoc :in-description options
))))
43 (if description-layers
44 `(progn ;eval-when (:compile-toplevel :load-toplevel :execute)
47 :in description-layers
48 :collect
`(define-description
49 ,name
,superdescriptions
,slots
51 :in-layer
(defining-description layer
)
52 (remove :in-description options
:key
#'car
)))))
53 `(progn ;eval-when (:compile-toplevel :load-toplevel :execute)
55 (defclass ,description-name
56 ,(append (mapcar #'defining-description
58 (unless (or (eq t name
)
59 (assoc :mixinp options
))
60 (list (defining-description t
))))
63 ,@(unless (assoc :metaclass options
)
64 '((:metaclass standard-description-class
))))
65 (initialize-descriptions)
66 (find-description ',name
)))))))