Macros 是宏参数的解构“;“真的需要吗?”;?

Macros 是宏参数的解构“;“真的需要吗?”;?,macros,lisp,destructuring,Macros,Lisp,Destructuring,我知道在LISP宏参数中进行解构是一件很好的事情;我想知道这是否必要。例如, (defmacro m1 (a) (car a)) 及 似乎是(大致)等价的-除了检查参数的正确形式 我的猜测是,解构使代码更容易编写/理解,但是任何使用它的代码都可能被翻译成不使用它的代码。我是对的还是这是一个愚蠢的初学者的错误?这不是必要的。可以让Lisp系统对宏调用进行解构,也可以在宏中编写自己的代码 如果您要编写自己的分解代码,则通常会将其与&rest或&body参数列表结合使用。一个常见的原因是宏lambd

我知道在LISP宏参数中进行解构是一件很好的事情;我想知道这是否必要。例如,

(defmacro m1 (a) (car a))

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


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

这不是必要的。可以让Lisp系统对宏调用进行解构,也可以在宏中编写自己的代码

如果您要编写自己的分解代码,则通常会将其与&rest或&body参数列表结合使用。一个常见的原因是宏lambda列表的语法可能性对于特定用途来说不够灵活。公共Lisp循环宏就是一个例子


使用宏lambda列表是一种很好的样式。它提供了一个带有参数和一些结构信息的接口。这还允许Lisp系统提供宏调用语法错误检查的简单形式。一个人必须手写的东西

这不是必要的。可以让Lisp系统对宏调用进行解构,也可以在宏中编写自己的代码

如果您要编写自己的分解代码,则通常会将其与&rest或&body参数列表结合使用。一个常见的原因是宏lambda列表的语法可能性对于特定用途来说不够灵活。公共Lisp循环宏就是一个例子


使用宏lambda列表是一种很好的样式。它提供了一个带有参数和一些结构信息的接口。这还允许Lisp系统提供宏调用语法错误检查的简单形式。一个人必须手写的东西

谢谢,这正是我所期望的——只是想确定一下。谢谢,这正是我所期望的——只是想确定一下。
(defmacro m2 ((a1 a2)) a1)