macros - 如何在普通 lisp 中编写宏定义宏

标签 macros lisp 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) 扩展为上面的第一个示例。我是一个口齿不清的新手,真的不知道该怎么做。感谢所有帮助。

最佳答案

只需编写一个扩展为另一个 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 可能有一种方法可以做到这一点,但是嵌套的反引号令人困惑:)

关于macros - 如何在普通 lisp 中编写宏定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121145/

相关文章:

programming-languages - 静态键入如何限制宏?

c++ - C++中长函数名和短函数名的宏

lisp - Common Lisp - 如何组合这两个简单的多项式函数?

clojure - 为什么Clojure之父说Scheme的true/false坏了?

c++ - 如何在C/C++中完成这个功能

regex - 文本编辑器 : Macros To Manipulate Strings

lisp - 为什么 Lisp 用于 AI?

lisp - 如何在 LISP 中定义一个函数,该函数传递两个 Form,然后随机执行它们

clojure - 无参数(和)返回 t

lisp - `control strings` 的清晰列表在哪里?使用 Lisp+Slime 时,很难找到关于 `format` 函数的 Hyperspec 文档