我有一个程序,它接受一个数据块和一个规则列表作为输入,同时应用一组标准规则和作为输入给该数据块的规则。两个输入的大小可能不同。
我希望能够写出这样的规则列表:
(rule-generating-macro
(rule-1-name rule-1-target
(rule-action-macro (progn actions more-actions)))
(rule-2-name rule-2-target
(rule-action-macro (or (action-2) (default-action))))
;; more rules
)现在,规则更加冗长--它们看起来更像
(defvar rule-list
`((rule-1-name rule-1-target
,@(rule-action-macro (progn actions more-actions)))
(rule-2-name rule-2-target
,@(rule-action-macro (or (action-2) (default-action))))
;; more rules
)后一种形式在我看来更难看,但是我不知道如何编写一个可以处理可变长度&rest参数的宏,对它进行迭代,然后返回转换后的结构。使用defun而不是defmacro并不是真正需要考虑的问题,因为(希望示例中显示的那样)我试图控制规则列表的求值,而不是在程序第一次看到列表时对它求值,一旦需要控制求值,就是在defmacro领域。在这种情况下,棘手的问题是rule-action-macro部分--让解释器读取它并使用它的扩展值是有问题的。
如何创建处理可变长度参数的宏,以便以简明的方式编写规则列表?
发布于 2013-02-13 07:32:57
defmacro将乐于接受&rest参数(有关Emacs Lisp,请参阅Defining Macros;对于Common Lisp,请参阅Macro Lambda Lists )。
然后你可以在宏体中使用它做任何你想做的事情--例如,遍历它。记住,宏不仅仅是反引号!
例如:
(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))https://stackoverflow.com/questions/14843326
复制相似问题