关于eq的方案和R5RS问题

问题描述 投票:0回答:2

您能解释为什么第一个为假,第二个为真吗?

这是如何工作的?谢谢。

(eq? '(1 2 3) '(1 2 3)) ;False
(eq? '() '()) ;True
scheme r5rs
2个回答
2
投票

只有一个空列表,因此()的所有使用都引用该列表,它本身就是eq?。存储模型的Scheme Specification描述说:

尽管如此,但可以理解,空白列表不能新分配的,因为它是唯一的对象。

eqv?的说明(由eq?描述引用)说,两个对象是等效的,如果

obj 1obj 2均为空列表

但是,当您创建一个非空列表时,它每次都会创建一个新列表,即使它们包含相同的元素,它们也不会彼此eq?


2
投票

引自TSPL3

[..]如果两个对象在内部用相同的指针值表示,则认为它们是相同的[..]空列表()出现在任何地方都与其本身相同。[..]不同的cons,vector,string等应用程序创建的两对,向量或字符串是不同的。

如果您改为写

(let ((x '(1 2 3)))
  (eq? x x))

它将是#t

© www.soinside.com 2019 - 2024. All rights reserved.