Lisp:'nil和nil之间有什么区别吗?

时间:2012-04-04 10:41:31

标签: lisp common-lisp

两个

(not 'nil)

(not nil)

评估为T'nilnil之间有什么区别吗?那么''nil呢?如果''nil评估为'nil,则''nil不应评估为nil吗?

3 个答案:

答案 0 :(得分:8)

字面上,

(quote <anything>)评估为<anything>。符号'<anything>表示(quote <anything>),无论<anything>是什么,它都会在未经评估的情况下返回。

此外,nil评估自己。

其他对象,当引用为文字时,也会评估自己:某些符号和所有非符号原子都是这样的。

'22之间有什么区别?他们都评价为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))