[英]How can I destructure an &rest argument of varying length in my elisp macro?
我有一个程序将一组数据和规则列表作为输入,将一组标准规则和作为输入提供的规则应用于数据块。 两个输入的大小可能会有所不同。
我希望能够编写如下规则列表:
(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
部分-让解释器阅读并使用其扩展值一直是有问题的。
如何创建一个处理可变长度参数的宏,以便可以以简洁的方式编写规则列表?
defmacro
将愉快地接受&rest
参数(请参阅为Emacs Lisp 定义宏和为Common Lisp 定义 宏Lambda列表 )。
然后,您可以在宏主体中执行几乎所有您想要的操作-例如,对其进行迭代。 请记住,宏不仅仅是反引号!
例如:
(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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.