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)
您可能会认为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)