У меня есть приблизительно два макросов (и поднимающийся) в моей кодовой базе, которые похожи на это:
(defmacro def-stat-method (method-name stat)
`(progn
(defmethod ,method-name ((monster monster))
(getf (stats monster) ,stat))
(defmethod (setf ,method-name) (value (monster monster))
(setf (getf (stats monster) ,stat) value))))
и это:
(defmacro def-energy-method (method-name stat)
`(progn
(defmethod ,method-name ((monster monster))
(getf (energies monster) ,stat))
(defmethod (setf ,method-name) (value (monster monster))
(setf (getf (energies monster) ,stat) value))))
Каждые из макросов имеют следующий синтаксис вызова: (def-stat-method ranged-weapon :ranged-weapon)
Я хотел бы макрос (def-foo-method macro-name method)
это расширяется в соответствующие макросы так, чтобы (def-foo-method def-stat-method stats)
расширяется в первый пример выше. Я - новичок шепелявости и действительно не знаю, как сделать это. Вся справка ценится.
Просто напишите макрос, который расширяется в другой defmacro, например:
(defmacro def-foo-method (macro-name method)
`(defmacro ,macro-name (method-name stat)
(let ((method ',method))
`(progn
(defmethod ,method-name ((monster monster))
(getf (,method monster) ,stat))
(defmethod (setf ,method-name) (value (monster monster))
(setf (getf (,method monster) ,stat) value))))))
Я думаю, что есть способ сделать это без let
, но вложенные обратные кавычки сбивают с толку :)
Мне этот код кажется медленным. Объектно-ориентированная диспетчеризация среды выполнения плюс поиск по списку свойств? Почему?
Иногда списки свойств добавляются к объектам CLOS, чтобы обеспечить хранилище для нечасто используемых слотов или сделать их легко расширяемыми (где все виды свойств могут быть добавлены, не зная их всех перед запуском программы). В общем, может быть лучше сделать свойства реальными слотами объекта.