两个
(not 'nil)
和
(not nil)
评估为T
,'nil
和nil
之间有什么区别吗?那么''nil
呢?如果''nil
评估为'nil
,则''nil
不应评估为nil
吗?
答案 0 :(得分:8)
(quote <anything>)
评估为<anything>
。符号'<anything>
表示(quote <anything>)
,无论<anything>
是什么,它都会在未经评估的情况下返回。
此外,nil
评估自己。
其他对象,当引用为文字时,也会评估自己:某些符号和所有非符号原子都是这样的。
'2
和2
之间有什么区别?他们都评价为2
!
另外,'"abc"
和"abc"
以及:foo
和':foo
之间有什么区别?
区别在于'2
的格式为(quote 2)
,而2
只是2
。他们评价同样的事情,但不是一回事。
评估Lisp意味着将数据视为表达式的源代码。两个表达式可以具有相同的值,但可以由不同的数据组成。例如4
,(+ 2 2)
和(* 2 2)
。
说,4
和(+ 2 2)
之间有什么区别?
如果4
和(+ 2 2)
都生成4,为什么'4
会产生4
,但'(+ 2 2)
会产生(+ 2 2)
?
引用意味着“给我这段程序代码作为基准,而不是它所代表的值。”
答案 1 :(得分:6)
评估NIL
时,您会获得variable named NIL的值,而当您评估'NIL
时,您会得到名为NIL的符号。但是,这两个东西被规范定义为同一个对象。见the Hyperspec on nil:
nil n。同时是
"NIL"
包中名为COMMON-LISP
的符号的对象,空列表,布尔值(或泛化的boolean)表示false,以及空类型的名称。
您可以自己检查一下:
(eq NIL 'NIL) ==> T
然而,等同性在那里停止。 ''NIL
评估到列表(quote NIL)
。
答案 2 :(得分:1)
只要您只考虑评估结果,即
,就没有区别nil
和
'nil
评估为相同的值(即nil
)。然而,就读者而言,有一个真正的区别,因为
nil ===> nil
,而
'nil ===> (quote nil)
如果你有像
这样的嵌套表格,这一点很有意思((nil) 'nil)
,读作
((nil) (quote nil))