Как мне написать макрос, определяющий макрос в общем lisp - PullRequest
10 голосов
/ 26 июня 2010

У меня есть около двух макросов (и лазание) в моей кодовой базе, которые выглядят так:

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

Ответы [ 2 ]

13 голосов
/ 26 июня 2010

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

2 голосов
/ 26 июня 2010

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

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

...