相关疑难解决方法(0)

如何在常见的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))))
Run Code Online (Sandbox Code Playgroud)

还有这个:

(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))))
Run Code Online (Sandbox Code Playgroud)

每个宏都具有以下调用语法: (def-stat-method ranged-weapon :ranged-weapon)

我想要一个宏(def-foo-method macro-name method)扩展到适当的宏,以便(def-foo-method def-stat-method stats)扩展到上面的第一个例子.我是一个口齿不清的新手,并不知道该怎么做.所有帮助赞赏.

lisp macros common-lisp

10
推荐指数
1
解决办法
749
查看次数

在宏内部,我可以,var评估为空白/没有?

感谢以前关于常见的lisp的答案:宏如何用编程生成的名称定义其他方法/宏?我有一个定义辅助函数的宏(实际上我有一个macrolet,我最喜欢的lisp-newbie-hammer).但是在这个宏中,有一些东西可以决定辅助函数是否需要接受特定的参数.所以我有一个带有几乎相同分支的if语句 - 在一个分支中,我将var放在生成函数的lambda列表中.在另一个分支中,我省略了var.(我正在为非程序员编写DSL,所以我不希望他们看到类似&可选的东西)

有没有办法避免在这里有基本重复的代码?如果我将var设置为"",那么""会出现在我生成的defuns的lambda列表中.如果我将var设置为nil,则会出现NIL.

是否有一个我可以使用的值,var完全没有任何评价,眨眼存在?(哲学上的兴趣,不应该有吗?)

macros common-lisp argument-passing

3
推荐指数
1
解决办法
94
查看次数

标签 统计

common-lisp ×2

macros ×2

argument-passing ×1

lisp ×1