Common Lisp中NULL和NIL的确切区别是什么?

时间:2014-05-23 09:55:10

标签: lisp common-lisp null

据我所知,NIL是很多东西的符号:空列表,或布尔值false。到目前为止一直很好,但为什么输出中有时会出现NULL?

clisp> (type-of NIL)
NULL
clisp> (type-of t)
BOOLEAN
clisp> (type-of (not t))
NULL
clisp> NIL
NIL
clisp> (eq NULL NIL)
ERROR..

所以NULL不是定义的符号,因为"BASIC-STRING-6"也不是。但我对NULL这个术语感到有点困惑,因为布尔值应该保留一个布尔值,但如果它被否定了。

5 个答案:

答案 0 :(得分:10)

NIL是一个符号。它也写成()type-of的输出在这里不一定有用。 HyperSpec说的是type-of

  

为具有对象的类型返回类型说明符typespec   一个元素。

但是给定了类型层次结构,以及通用类型(一切都是类型t),type-of的输出可能没有用。如果你想知道某些特定类型是typep,那么这里有什么用处。使用typep,我们可以看到,无论什么类型告诉我们,nil是布尔值,是符号,是列表,还有空。另一方面,t是符号,布尔值,而不是列表,而不是null。

CL-USER> (type-of nil)
NULL
CL-USER> (type-of t)
BOOLEAN
CL-USER> (typep nil 'boolean)   ; both are booleans
T
CL-USER> (typep t 'boolean)
T
CL-USER> (typep nil 'symbol)    ; both are symbols
T
CL-USER> (typep t 'symbol)
T
CL-USER> (typep nil 'list)      ; only nil is a list
T
CL-USER> (typep t 'list)
NIL
CL-USER> (typep nil 'null)      ; only nil is a null
T
CL-USER> (typep t 'null)
NIL

答案 1 :(得分:3)

您可能认为T是布尔值而NIL不是布尔值是奇怪的。原因是NIL有几个帽子。它是空列表,它是符号NIL,它是布尔值假的。因此它有时会出现在不适合布尔类型值的上下文中,因此从类型安全的角度来看,boolean类型不适合它。有点类似,在Scheme中,boolean false与空列表不同。

NULL为type的{​​{1}}。

NIL是在Common Lisp中表示NULL的符号。它也是空列表NIL的表示。 ()是检查变量是否为NULL的函数(即#'NULL eq)。

如果要使用NULL而不是NIL,则可以定义NULL。 (这在实践中可能是一个糟糕的主意。

NIL

答案 2 :(得分:3)

确切的区别在于NULL是上下文中的一种类型,而NIL是一种符号。

NULL是仅包含符号NIL的类型。

NIL作为类型是空类型(没有类型为NIL的对象):

NIL作为对象是代表各种“不”的符号。

答案 3 :(得分:1)

  

所以NULL不是定义的符号,因为“BASIC-STRING-6”也不是。

NULL 符号。它没有任何价值。符号NULL是类型NULL的名称和函数NULLNULL作为一种类型有一个元素:NIL

NIL是一个符号,NIL是其值。因此NIL是一个常量,它本身就是值。 NIL也是一种类型,没有对象的空类型。

答案 4 :(得分:-1)

类型指示符(如INTEGER,(ARRAY *),(MEMBER T NIL)等)不会计算为值。因此,如果您尝试对其进行评估,则类型名称NULL会引发错误,这一点不足为奇。回想一下,类型/子类型层次结构不是一个简单的树,所以NULL是很多东西的子类型; CONS,BOOLEAN,LIST等。

请注意,很多事情都被视为真实的,不属于BOOLEAN类型。 BOOLEAN只是'(成员nil t)的简称。所以(类型'foo'(成员nil t))与'(typep'foo'boolean)等价。

关于学习曲线的这一点,值得记住,Common Lisp是动态类型的,类型声明更倾向于文档,并建议编译器的优化器和警告子系统可以采取或忽略。

NULL也是一个函数。检查手册的索引可能对您有所帮助。