Macros 如何分解&;我的elisp宏中长度可变的rest参数?

Macros 如何分解&;我的elisp宏中长度可变的rest参数?,macros,lisp,elisp,Macros,Lisp,Elisp,我有一个程序,它将数据块和规则列表作为输入,同时应用一组标准规则和作为数据块输入的规则。两个输入的大小可能不同 我希望能够写出如下规则列表: (规则生成宏 (规则-1-名称规则-1-目标 (规则操作宏(progn actions more actions))) (规则-2-名称规则-2-目标 (规则动作宏(或(动作-2)(默认动作))) 更多的规则 ) 现在,规则更加冗长——它们看起来更像 (defvar规则列表 `((规则-1-名称规则-1-目标 ,@(规则操作宏(progn actions

我有一个程序,它将数据块和规则列表作为输入,同时应用一组标准规则和作为数据块输入的规则。两个输入的大小可能不同

我希望能够写出如下规则列表:

(规则生成宏
(规则-1-名称规则-1-目标
(规则操作宏(progn actions more actions)))
(规则-2-名称规则-2-目标
(规则动作宏(或(动作-2)(默认动作)))
更多的规则
)
现在,规则更加冗长——它们看起来更像

(defvar规则列表
`((规则-1-名称规则-1-目标
,@(规则操作宏(progn actions more actions)))
(规则-2-名称规则-2-目标
,@(规则动作宏(或(动作-2)(默认动作)))
更多的规则
)
后一种形式在我看来更难看,但我不知道如何编写一个宏来处理一个可变长度的
&rest
参数,对其进行迭代,并返回转换后的结构。使用
defun
而不是
defmacro
实际上并不在表上,因为(如示例所示)我试图控制规则列表的计算,而不是在我的程序第一次看到它时计算列表,一旦你需要控制计算,你就进入了
defmacro
领域。在这种情况下,棘手的问题是
规则动作宏
部分-让解释器读取并使用它的扩展值是非常困难的有问题


如何创建处理可变长度参数的宏,以便以简洁的方式编写规则列表?

defmacro
将乐于接受
&rest
参数 (有关Emacs Lisp和Common Lisp,请参见)

然后你可以在宏体中用它做任何你想做的事情-例如,迭代它。记住,宏不仅仅是反引号

例如:


好吧,我想你的回答是在引导我走向“我以前所做的是错误的。”可能我没有完全掌握如何让宏返回我想要的修改过的结构,因此得到的结果在我看来就像“它不工作,
&rest
只是一个我无法操纵的肿块。”我会试试你的建议。打破我对这种情况的心理模型的真正问题其实有些不同:我把一个引用的列表作为一个参数传递给宏。我相信你可以想象这会让生活变得多么艰难。然而,我意识到这一点的方式是使用你的例子,然后慢慢地将其修改到我的pu中既然你的回答让我找到了我要去的地方,我接受了:`(progn,@forms)。。。啊,这就是我需要的。
(defmacro multidefvar (&rest vars)
  (let ((forms (mapcar (lambda (var) `(defvar ,var)) vars)))
    `(progn ,@forms)))

(macroexpand '(multidefvar a b c d))
==> (PROGN (DEFVAR A) (DEFVAR B) (DEFVAR C) (DEFVAR D))