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

mat*_*ath 4 lisp null common-lisp

据我所知,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..
Run Code Online (Sandbox Code Playgroud)

所以NULL不是定义的符号,因为"BASIC-STRING-6"它也不是.但我对术语NULL有点困惑,因为布尔值应该保持布尔值,但如果它被否定.

Jos*_*lor 10

NIL是一个象征.它也写成().输出在type-of这里不一定有用.HyperSpec说的类型:

返回类型说明符typespec,用于将对象作为元素的类型.

但是给定类型层次结构,以及通用类型(一切都是类型t),type-of的输出可能没有用.这里有什么用处,如果你想知道某个特定类型的东西是typep.使用typep,我们可以看到,无论是什么类型告诉我们,这nil是一个布尔值,是一个符号,是一个列表,还有一个null.另一方面,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
Run Code Online (Sandbox Code Playgroud)


Syl*_*ter 5

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

NULL 以typeof 的形式给出NIL

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

如果您想使用 NULL 而不是 NIL,您可以定义 NULL。(这在实践中可能是一个糟糕的想法。

(defconstant null nil)
(type-of NULL) ; ==> NULL
NULL           ; ==> NIL
(eq NULL NIL)  ; ==> T
Run Code Online (Sandbox Code Playgroud)

  • 最能帮助我理解的是,NIL 实际上只是一个符号,但却是一个非常特殊的符号。 (2认同)