宏观参数的解构“真的需要”吗?

时间:2012-02-01 01:19:26

标签: macros lisp destructuring

我理解LISP宏参数中的解构是一件好事;我想知道它是否必要。例如,

(defmacro m1 (a) (car a))

(defmacro m2 ((a1 a2)) a1)

似乎(大致)等效 - 除了检查参数的正确形式。

我的猜测是,解构使代码更易于编写/理解,但使用它的任何代码都可能被翻译成不能编写/理解的代码。我是对的还是这是一个愚蠢的初学者的错误?

1 个答案:

答案 0 :(得分:4)

这不是必需的。您可以让Lisp系统对宏调用进行解析,也可以在宏内部编写自己的代码。

如果您要编写自己的解构代码,通常会将其与& rest或& body参数列表组合在一起。一个通常的原因还在于宏lambda列表的语法可能性对于某个目的而言不够灵活。一个例子是Common Lisp LOOP宏。

使用宏lambda列表是一种很好的风格。它提供了一个带参数和一些结构信息的接口。这也允许Lisp系统提供宏调用的简单形式的语法错误检查。需要手工编写的东西。