在Common Lisp中,()
似乎是一种自我评估的形式。也就是说,它对自身(或其别名nil
)求值。因此,似乎没有必要引用它。但是在我的quicklisp目录中使用grep会发现'()
的许多实例,这些实例是由许多人在许多不同项目中编写的。写出引用的版本有技术上的原因吗? Common Lisp the Lanugage, 2nd Edition,Section 1.2.2提到了样式上的区别,在这些地方您可能希望使用()
来强调空列表,而要使用nil
来强调 bool 值false,但是不涵盖此问题。 Steele使用的示例之一是:
(append '() '())
...我相信它可以写得和:
(append () ())
...那么为什么要在其中扔掉多余的
QUOTEs
?当然,它不会伤害任何事情。从风格上讲,一种形式是否普遍优于另一种形式?肯定有人会认为带引号的形式使添加元素变得更简单,以防万一您改变主意,而实际上想要一个非空的文字列表。或使用引号存在某种对称性,因为非空文字列表也将需要它。这个历史包from与传统所传承的其他/较旧的语言混在一起吗?
这与Scheme不同,在Scheme中您确实需要引用它。似乎您不必在elisp中引用它,所以也许以一种绕圈的方式将其与lisp-1与lisp-2相关联?
最佳答案
引号具有非常丰富的属性,清楚地表明您的意思是 token 应为原义数据。多年以后,当您或同事重新访问代码时,情况更是如此。
您必须使用()
(不带引号)以未经评估的形式声明一个空列表,例如参数列表或类父类(super class)和槽,其中引号实际上会造成伤害。实际上,您也可以使用nil
,但为清楚起见,当声明的内容为列表时,则不应使用。
这是the specification的相关摘录:
关于lisp - Common Lisp中的'()vs(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37424777/