Common lisp 为什么有些人对循环宏中的子句使用关键字?

Common lisp 为什么有些人对循环宏中的子句使用关键字?,common-lisp,conventions,Common Lisp,Conventions,它解决了什么问题吗?根据PCL的第一个脚注,如果不是关键字,它将在当前包中插入符号。由于所有关键字都在关键字包中,这将防止多个符号在不同的包中被拘留。但还有其他好处吗?这会造成什么问题?(我猜一定有问题,因为这不是流行的惯例)不,唯一的优点是在读取代码的任何包中都不会有额外的符号 这本身并不是一个问题,但它是使(某些)自动内省元素变得更加困难的因素之一。如果小心使用循环“关键字”的关键字,则只需查看包中的符号即可轻松识别所有函数、变量和宏的名称。在支持lisp的编辑器中,关键字会高亮显示。在循环

它解决了什么问题吗?根据PCL的第一个脚注,如果不是关键字,它将在当前包中插入符号。由于所有关键字都在关键字包中,这将防止多个符号在不同的包中被拘留。但还有其他好处吗?这会造成什么问题?(我猜一定有问题,因为这不是流行的惯例)

不,唯一的优点是在读取代码的任何包中都不会有额外的符号


这本身并不是一个问题,但它是使(某些)自动内省元素变得更加困难的因素之一。如果小心使用循环“关键字”的关键字,则只需查看包中的符号即可轻松识别所有函数、变量和宏的名称。

在支持lisp的编辑器中,关键字会高亮显示。在循环中使用关键字有助于突出显示循环结构。

同样来自PCL:

循环关键字有点用词不当,因为它们不是关键字符号。实际上,
循环
并不关心符号来自哪个包。当
循环
宏解析其主体时,它认为任何适当命名的符号都是等效的。如果需要,您甚至可以使用真正的关键字--
:for
:cross
,等等--因为它们也有正确的名称。但大多数人只是使用简单的符号。因为循环关键字仅用作语法标记,所以它们是否用于其他目的(函数名或变量名)无关紧要


(Peter Seibel,《实用通俗Lisp》,脚注8。)

我认为这主要不是基于观点的。像“你为什么这样做?”这样的问题可能是,但这是一个关于在野外实际观察到的代码的问题,并且想知道人们为什么这样写。它有事实上的答案,就像“为什么人们在C中等式检查的左边写常量,在右边写变量,例如,
-1==result
?”这两种情况下都有事实上的答案(例如,“这使得意外地做
result=-1
result==1
)更难)。