При принятии классы по CLOS я встретил по той же схеме несколько раз:Используя петлю на макро для создания классов слотов в Common Lisp
(defclass class-name()
((field-1
:initarg field-1
:initform some-value
:accessor field-1)
(field-2
:initarg field-2
:initform another-value
:accessor field-2)
(...)
(field-n
:initarg field-n
:initform n-value
:accessor field-n)))
(это ли хороший дизайн то, что я буду учиться с время)
Я попытался решить это с помощью макроса, чтобы я мог позвонить, сказать:
(defclass-with-accessors 'class-name
(('field-1 some-value)
('field-2 another-value)
(...)
('field-n n-value)))
Мои первые решения (игнорируя гигиену пока) был разделен на два макроса: один, чтобы сделать каждый поле, другое сделать сам класс.
Макрос, чтобы поля аксессоров кажется правильным:
(defmacro make-accessor-field (name form)
`(,name
:initarg ,(make-keyword name)
:initform ,form
:accessor ,name))
Но я не получаю главное право макросъемки. Моя первая попытка была:
(defmacro defclass-with-accessors (name body)
`(defclass ,name() \(
,(loop for my-slot in body collect
(make-accessor-field (car my-slot) (cadr my-slot)))))
Но это не действует, SBCL дает мне следующую ошибку в defmacro оценки:
; in: DEFMACRO DEFCLASS-WITH-ACCESSORS
; (MAKE-ACCESSOR-FIELD (CAR MY-SLOT) (CADR MY-SLOT))
;
; caught ERROR:
; during macroexpansion of (MAKE-ACCESSOR-FIELD (CAR MY-SLOT) (CADR MY-SLOT)).
; Use *BREAK-ON-SIGNALS* to intercept.
;
; The value (CAR MY-SLOT)
; is not of type
; (OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING SYMBOL CHARACTER).
;
; compilation unit finished
; caught 1 ERROR condition
STYLE-WARNING:
redefining COMMON-LISP-USER::DEFCLASS-WITH-ACCESSORS in DEFMACRO
Что именно происходит? Как компилятор может указать тип (автомобильный слот), если слот не определен? Как я могу перейти к правильному определению этого макроса?
Рассмотрите проблему с помощью [yasnippet] (https://github.com/AndreaCrotti/yasnippet-snippets/blob/master/lisp-mode/class). – PuercoPop
Я предполагаю, что каждый прохожий сделал что-то подобное в своем карьере. Вопрос в том, стоит ли вводить такую тонкую обертку вокруг уже довольно сжатой стандартной формы. – Svante