-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
documentable.lisp
30 lines (26 loc) · 1.38 KB
/
documentable.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(in-package #:org.shirakumo.radiance.core)
(defclass documentable ()
((documentation :initarg :documentation))
(:default-initargs
:documentation NIL))
(defmethod documentation ((documentable documentable) type)
(slot-value documentable 'documentation))
(defmethod (setf documentation) (string (documentable documentable) type)
(setf (slot-value documentable 'documentation) string))
(defmacro define-documentable (name direct-superclasses direct-slots &rest options)
(let ((find-function (second (find :find-function options :key #'first))))
`(progn
(defclass ,name (,@direct-superclasses documentable)
,direct-slots
,@(remove :find-function options :key #'first))
,@(when find-function
`((defmethod documentation ((name symbol) (type (eql ',name)))
(documentation (,find-function name) T))
(defmethod (setf documentation) (string (name symbol) (type (eql ',name)))
(setf (documentation (,find-function name) T) string))
(defmethod documentation ((name cons) (type (eql ',name)))
(documentation (,find-function name) T))
(defmethod (setf documentation) (string (name cons) (type (eql ',name)))
(setf (documentation (,find-function name) T) string))
(docs:define-documentation-test ,name (name)
(,find-function name)))))))