(not 'nil)
和
(not nil)
评估为T
,所以有'nil
和nil
之间有什么区别?那么''nil
呢?如果''nil
的计算结果为'nil
,那么''nil
的计算结果不应该为nil
?
(not 'nil)
和
(not nil)
评估为T
,所以有'nil
和nil
之间有什么区别?那么''nil
呢?如果''nil
的计算结果为'nil
,那么''nil
的计算结果不应该为nil
?
(quote <anything>)
从字面上评估为<anything>
。符号'<anything>
意味着(quote <anything>)
,不管<anything>
是什么,它只是简单地返回而不被评估。
此外,nil
评估自己。
当引用文字时,其他对象也评估自己:某些符号和所有非符号原子都是这样。
'2
和2
有什么区别?他们都评估为2
!
另外,'"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)
?引用的意思是“给我这段程序代码作为数据,而不是它表示的值”。
没有区别,只要你认为评价的唯一结果,即
nil
和
'nil
评价为相同的值(即nil
)。然而,有,真正的区别,就读者而言,由于
nil ===> nil
而
'nil ===> (quote nil)
,这是特别有趣的,如果你有嵌套形式像
((nil) 'nil)
其中读数为
((nil) (quote nil))
当您评估NIL
时,您会得到variable named NIL的值,当您评估'NIL
时,会得到名为NIL的符号。但是,这两件事是由规范定义为同一个对象。见the Hyperspec on nil:
零ñ。该对象一次是
COMMON-LISP
包中名为"NIL"
的符号,空列表,表示false的布尔值(或广义布尔值)以及空类型的名称。
您可以检查自己:
(eq NIL 'NIL) ==> T
然而,等价停在那里。 ''NIL
评估到列表(quote NIL)
。