当前位置:  开发笔记 > 编程语言 > 正文

defmacro形式参数列表中`(&rest xs)`和`xs`之间的区别

如何解决《defmacro形式参数列表中`(&restxs)`和`xs`之间的区别》经验,为你挑选了1个好方法。

在Practical Common Lisp的第8章,宏:定义你自己,我们定义一个宏with-gensyms如下:

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

这是什么目的(&rest names)?如果我们用just替换它names,效果似乎是一样的.在这两种情况下,我们都将符号列表传递给"gensym-ed".



1> Rainer Joswi..:

区别:

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

在a上调用的调试器SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR:

解析参数时出错DEFMACRO WITH-GENSYMS:

伪造子列表,A以满足lambda列表(&REST NAMES)

names匹配任何东西 当有人使用没有列表的宏时,错误来自LOOP宏,需要一个列表:

在a上调用的调试器TYPE-ERROR:该值A不是类型LIST.

因此,您会得到更好,更早的错误.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有