macros - defmacro 形式参数列表中 `(&rest xs)` 和 `xs` 之间的差异

标签 macros pattern-matching common-lisp practical-common-lisp

实用 Common Lisp Chapter 8 ,宏:定义你自己的,我们定义一个宏with-gensyms如下:

(defmacro with-gensyms ((&rest names) &body body)
  `(let ,(loop for n in names collect `(,n (gensym)))
    ,@body))

(&其余名称)的用途是什么?如果我们只用 names 替换它,效果似乎是一样的。在这两种情况下,我们都会传入要“gensym-ed”的符号列表。

最佳答案

区别:

arglist 内的

(&rest names) ((&rest names) &body body) 仅匹配列表。当有人将宏与其他东西一起使用时,错误来自宏扩展器:

debugger invoked on a SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR:

error while parsing arguments to DEFMACRO WITH-GENSYMS:

bogus sublist A to satisfy lambda-list (&REST NAMES)

names 匹配任何内容。当有人使用没有列表的宏时,错误来自需要列表的 LOOP 宏:

debugger invoked on a TYPE-ERROR: The value A is not of type LIST.

因此您会得到更好、更早的错误。

关于macros - defmacro 形式参数列表中 `(&rest xs)` 和 `xs` 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526235/

相关文章:

lisp - 临时编辑全局变量

python - 我正在尝试使用 python 的 re 模块执行某些模式匹配

regex - 从文本文件中的重复范围模式中获取特定行

comparison - 哈希表的相等谓词

macros - 在运行时处理内部变量和数据结构的 LISP 宏

java - 使用 [3 :0] substring in it 解析字符串

vim - 如何重新初始化 swank?

c# - Visual Studio 宏 - 代码生成语言

macros - 在 Common Lisp 中,为什么宏 OR 使用 gensym 而不是 AND?

c++ - 在没有正则表达式的情况下选择特定的字符串模式