1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
(in-package #:def)
(defmacro defclass (name parents &body simple-slots)
(let (slots)
(dolist (slot simple-slots)
(if (symbolp slot)
(push `(,slot :initarg ,(intern (symbol-name slot) 'keyword) :accessor ,slot) slots)
(let ((slot-name (first slot))
(slot-type (second slot))
(slot-form (third slot)))
(cond ((and slot-type slot-form)
(push `(,slot-name :initarg ,(intern (symbol-name slot-name) 'keyword) :accessor ,slot-name :type ,slot-type :initform ,slot-form) slots))
(slot-type
(push `(,slot-name :initarg ,(intern (symbol-name slot-name) 'keyword) :accessor ,slot-name :type ,slot-type) slots))
(t
(push `(,slot-name :initarg ,(intern (symbol-name slot-name) 'keyword) :accessor ,slot-name) slots))))))
`(cl:defclass ,name ,parents ,slots)))
|