繁体   English   中英

如何在elisp宏中解构长度可变的&rest参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM