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 description-attributes (description)
11 (description-class-attributes (class-of description
)))
13 (defun find-attribute (description attribute-name
)
14 (find attribute-name
(description-attributes description
)
15 :key
#'attribute-name
))
17 (define-layered-function description-active-descriptions
(description)
18 (:method
((description standard-description-object
))
19 (attribute-value (find-attribute description
'active-descriptions
)))
20 (:method
((description attribute
))
21 (attribute-active-descriptions description
)))
23 (define-layered-function description-inactive-descriptions
(description)
24 (:method
((description standard-description-object
))
25 (attribute-value (find-attribute description
'inactive-descriptions
)))
26 (:method
((description attribute
))
27 (attribute-inactive-descriptions description
)))
29 (define-layered-function attributes
(description)
30 (:method
(description)
31 (let* ((active-attributes
32 (find-attribute description
'active-attributes
))
33 (attributes (when active-attributes
34 (attribute-value active-attributes
))))
36 (mapcar (lambda (spec)
45 (and (attribute-active-p attribute
)
46 (some #'layer-active-p
48 (slot-definition-layers
49 (attribute-effective-attribute-definition attribute
))))))
50 (description-attributes description
))))))
58 (defmacro define-description
(name &optional superdescriptions
&body options
)
59 (let ((description-name (defining-description name
)))
60 (destructuring-bind (&optional slots
&rest options
) options
61 (let ((description-layers (cdr (assoc :in-description options
))))
62 (if description-layers
63 `(progn ;eval-when (:compile-toplevel :load-toplevel :execute)
66 :in description-layers
67 :collect
`(define-description
68 ,name
,superdescriptions
,slots
70 :in-layer
(defining-description layer
)
71 (remove :in-description options
:key
#'car
)))))
72 `(progn ;eval-when (:compile-toplevel :load-toplevel :execute)
74 (defclass ,description-name
75 ,(append (mapcar #'defining-description
77 (unless (or (eq t name
)
78 (assoc :mixinp options
))
79 (list (defining-description t
))))
82 ,@(unless (assoc :metaclass options
)
83 '((:metaclass standard-description-class
))))
84 (initialize-descriptions)
85 (find-description ',name
)))))))