您能解释为什么第一个为假,第二个为真吗?
这是如何工作的?谢谢。
(eq? '(1 2 3) '(1 2 3)) ;False
(eq? '() '()) ;True
只有一个空列表,因此()
的所有使用都引用该列表,它本身就是eq?
。存储模型的Scheme Specification描述说:
尽管如此,但可以理解,空白列表不能新分配的,因为它是唯一的对象。
和eqv?
的说明(由eq?
描述引用)说,两个对象是等效的,如果
obj 1和obj 2均为空列表
但是,当您创建一个非空列表时,它每次都会创建一个新列表,即使它们包含相同的元素,它们也不会彼此eq?
。
引自TSPL3:
[..]如果两个对象在内部用相同的指针值表示,则认为它们是相同的[..]空列表()出现在任何地方都与其本身相同。[..]不同的cons,vector,string等应用程序创建的两对,向量或字符串是不同的。
如果您改为写
(let ((x '(1 2 3)))
(eq? x x))
它将是#t
。