Как я пишу макрос макроопределения в языке Common LISP

У меня есть приблизительно два макросов (и поднимающийся) в моей кодовой базе, которые похожи на это:

(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) расширяется в первый пример выше. Я - новичок шепелявости и действительно не знаю, как сделать это. Вся справка ценится.

10
задан krzysz00 25 June 2010 в 20:14
поделиться

2 ответа

Просто напишите макрос, который расширяется в другой 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 , но вложенные обратные кавычки сбивают с толку :)

13
ответ дан 3 December 2019 в 22:34
поделиться

Мне этот код кажется медленным. Объектно-ориентированная диспетчеризация среды выполнения плюс поиск по списку свойств? Почему?

Иногда списки свойств добавляются к объектам CLOS, чтобы обеспечить хранилище для нечасто используемых слотов или сделать их легко расширяемыми (где все виды свойств могут быть добавлены, не зная их всех перед запуском программы). В общем, может быть лучше сделать свойства реальными слотами объекта.

2
ответ дан 3 December 2019 в 22:34
поделиться