【发布时间】:2013-02-12 22:48:07
【问题描述】:
我有一个程序,它将一块数据和一个规则列表作为输入,将一组标准规则和作为输入的规则应用到数据块中。两个输入的大小可能会有所不同。
我希望能够写出这样的规则列表:
(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 部分——让解释器读取它并使用它的扩展值是有问题的。
如何创建一个处理可变长度参数的宏,以便以简洁的方式编写规则列表?
【问题讨论】: