我有一个程序,它将一块数据和一个规则列表作为输入,同时应用一组标准规则和作为数据块输入的规则。两个输入的大小可能会有所不同。
我希望能够编写这样的规则列表:
(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
参数、迭代它并返回转换后的结构的宏。使用 adefun
而不是 adefmacro
并不是真的在桌面上,因为(希望示例显示)我试图控制规则列表的评估,而不是在我的程序第一次看到它时评估列表,并且一旦你需要控制评估,你在defmacro
领域。在这种情况下,棘手的问题是rule-action-macro
部分 - 让解释器阅读并使用其扩展值是有问题的。
如何创建一个处理可变长度参数的宏,以便以简洁的方式编写规则列表?