据我所知,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这个术语感到有点困惑,因为布尔值应该保留一个布尔值,但如果它被否定了。
答案 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的名称和函数NULL。 NULL
作为一种类型有一个元素: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也是一个函数。检查手册的索引可能对您有所帮助。