Common Lisp中的'()vs()

Gre*_*olz 5 lisp common-lisp language-lawyer empty-list

在Common Lisp中,它似乎()是一种自我评估的形式.也就是说,它评估自身(或其别名nil).所以似乎没有必要引用它.但是在我的quicklisp目录中使用grep可以找到'()很多不同人在许多不同项目中编写的实例.写出引用版本有技术原因吗? Common Lisp the Lanugage,2nd Edition,Section 1.2.2,提到了你可能想要强调空列表的样式差异(),以及布尔值假nil,但不包括这个问题.Steele使用的一个例子是:

(append '() '())
Run Code Online (Sandbox Code Playgroud)

...我认为可以写得和以下一样:

(append () ())
Run Code Online (Sandbox Code Playgroud)

...那么为什么要把额外的东西QUOTEs放在那里?当然它不会伤害事物.在风格上,一种形式通常优先于另一种形式?有人可以肯定地说,引用表单使得添加元素变得更简单,以防你改变主意,并且真的想要一个非空的文字列表.或者使用引号存在一定的对称性,因为非空的文字列表也需要它.

这些历史包袱是否与传统上传承的其他/较旧的相关语言有关?

这与Scheme不同,您需要引用它.而且似乎你不必在elisp中引用它,所以也许它可能与lisp-1和lisp-2有关.

ace*_*ent 8

引用有一个非常有用的属性,清楚地表明你的意思是令牌应该是文字数据.当你或同事多年后重新访问代码时更是如此.

您必须使用()(不带引号)在非评估表单中声明一个空列表,例如参数列表或类超类和插槽,其中引号实际上会造成损害.实际上,您也可以使用nil,但为了清楚起见,您不应该在声明的东西是列表时使用.


以下是规范的相关摘录:

1.4.1.4.4无

nil有各种各样的含义.它是COMMON-LISP包中带有名称的符号"NIL",它是boolean(和generalized boolean)false,它是空列表,它是空类型的名称(所有类型的子类型).

在Common Lisp中,nil可以互换地标注为NIL或者().按照惯例,符号的选择提供了一个关于它正在扮演的角色中的哪一个的暗示.

For Evaluation?  Notation  Typically Implied Role       
----------
Yes              nil       use as a boolean.            
Yes              'nil      use as a symbol.             
Yes              '()       use as an empty list         
No               nil       use as a symbol or boolean.  
No               ()        use as an empty list.        
Run Code Online (Sandbox Code Playgroud)

图1-1.NIL的符号

仅在本文档中,nil有时也会将其标记为false,以强调其作为布尔值的作用.

例如:

(print ())                          ;avoided
(defun three nil 3)                 ;avoided 
'(nil nil)                          ;list of two symbols
'(() ())                            ;list of empty lists
(defun three () 3)                  ;Emphasize empty parameter list.
(append '() '()) =>  ()              ;Emphasize use of empty lists
(not nil) =>  true                   ;Emphasize use as Boolean false
(get 'nil 'color)                   ;Emphasize use as a symbol
Run Code Online (Sandbox Code Playgroud)

在某些情况下,某种功能有时被称为"假"或"是真的".由于没有任何函数对象可以相同,nil并且所有函数对象在被视为布尔值时都表示为true,因此说该函数实际上是错误的并且无趣地说它实际上是真的是毫无意义的.相反,这些短语只是传统的替代方式,分别表示函数"返回false"或"返回true".