双方都
(not 'nil)
and
(not nil)
评估为T
,那么'nil
和nil
之间有什么区别吗?''nil
又如何呢?如果''nil
评估为'nil
,那么''nil
也应该评估为nil
,对吗?
双方都
(not 'nil)
and
(not nil)
评估为T
,那么'nil
和nil
之间有什么区别吗?''nil
又如何呢?如果''nil
评估为'nil
,那么''nil
也应该评估为nil
,对吗?
(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)
呢?
引用的意思是,“将这段程序代码作为数据返回,而不是它所代表的值。”
NIL
时,你会得到名为NIL的变量的值,而当你评估'NIL
时,你会得到名为NIL的符号。然而,这两个东西被规范定义为相同的对象。请参见nil的Hyperspec:
nil n. 即是COMMON-LISP包中名为
"NIL"
的符号,也是空列表、表示假的布尔(或广义布尔)以及空类型的名称。
你可以自己检查:
(eq NIL 'NIL) ==> T
没有区别,只要你考虑评估结果即可。
nil
并且
'nil
评估为相同的值(即nil
)。然而,就读者而言,确实存在真正的差异,因为
nil ===> nil
而
'nil ===> (quote nil)
如果您有嵌套表单,这将特别有趣。
((nil) 'nil)
这段代码被读作
((nil) (quote nil))