我的代码库中有大约两个宏(和攀爬),如下所示:
(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)
扩展为上面的第一个示例。我是一个 lisp 新手,真的不知道该怎么做。感谢所有帮助。
只需编写一个扩展为另一个 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
,但是嵌套的反引号令人困惑:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)