首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在elisp宏中解析长度可变的rest参数(&R)?

如何在elisp宏中解析长度可变的rest参数(&R)?
EN

Stack Overflow用户
提问于 2013-02-13 06:48:08
回答 1查看 742关注 0票数 2

我有一个程序,它接受一个数据块和一个规则列表作为输入,同时应用一组标准规则和作为输入给该数据块的规则。两个输入的大小可能不同。

我希望能够写出这样的规则列表:

代码语言:javascript
运行
复制
(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
 )

现在,规则更加冗长--它们看起来更像

代码语言:javascript
运行
复制
(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部分--让解释器读取它并使用它的扩展值是有问题的。

如何创建处理可变长度参数的宏,以便以简明的方式编写规则列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 07:32:57

defmacro将乐于接受&rest参数(有关Emacs Lisp,请参阅Defining Macros;对于Common Lisp,请参阅Macro Lambda Lists )。

然后你可以在宏体中使用它做任何你想做的事情--例如,遍历它。记住,宏不仅仅是反引号!

例如:

代码语言:javascript
运行
复制
(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))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14843326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档