> (eq? 1 1)
#t
> (eq? 1.1 1.1)
#f
> (= 1.1 1.1)
#t
这是DrScheme中的交互窗口。有人可以解释一下=和eq之间的区别吗?在Scheme?
答案 0 :(得分:9)
=比较数字。情商?测试参数是否代表内存中的同一数据对象。 EQV?应该在第二种情况下工作,因为它测试与eq相同?但特别测试原语。 More on equlivence predicates in scheme here
答案 1 :(得分:3)
我猜是因为
当量?评估#f除非它 参数表示相同的数据 记忆中的对象;
和
Scheme存储不精确的数字(1.1) 与确切的数字不同(1)
两个1.1参数不在内存中的相同位置,并返回#f for eq?
答案 2 :(得分:3)
eq?是不可预测的。是否实现取决于数字文字是否被内插,以便相同的数字位于内存中的相同位置。例如,Racket语言最近选择在阅读期间实习这样的文字。 http://www.mail-archive.com/dev@racket-lang.org/msg04893.html
您无法确定您的语言实现的运行时是否唯一地代表每个数字。这可能会影响装箱的值,如浮动和bignums。这就是为什么 = 作为数字的谓词存在的原因:它检查内容的等价性,而不是浅指针等式。
这不是像Scheme这样的语言所独有的:例如,在Python中出现了相等与平等( 与 == )。
答案 3 :(得分:1)
第一个区别:eq?
适用于任何一对值,而=
适用于任意数量的数字。
还有其他几个equivalence predicates。他们中的大多数只接受两个参数。 =