我理解LISP宏参数中的解构是一件好事;我想知道它是否必要。例如,
(defmacro m1 (a) (car a))
和
(defmacro m2 ((a1 a2)) a1)
似乎(大致)等效 - 除了检查参数的正确形式。
我的猜测是,解构使代码更易于编写/理解,但使用它的任何代码都可能被翻译成不能编写/理解的代码。我是对的还是这是一个愚蠢的初学者的错误?
答案 0 :(得分:4)
这不是必需的。您可以让Lisp系统对宏调用进行解析,也可以在宏内部编写自己的代码。
如果您要编写自己的解构代码,通常会将其与& rest或& body参数列表组合在一起。一个通常的原因还在于宏lambda列表的语法可能性对于某个目的而言不够灵活。一个例子是Common Lisp LOOP宏。
使用宏lambda列表是一种很好的风格。它提供了一个带参数和一些结构信息的接口。这也允许Lisp系统提供宏调用的简单形式的语法错误检查。需要手工编写的东西。