【发布时间】:2010-10-30 19:41:15
【问题描述】:
> (eq? 1 1)
#t
> (eq? 1.1 1.1)
#f
> (= 1.1 1.1)
#t
这是 DrScheme 中的交互窗口。有人可以解释=和eq之间的区别吗?在方案中?
【问题讨论】:
-
比较有趣的问题是
eq?、equal?和eqv?之间的区别
> (eq? 1 1)
#t
> (eq? 1.1 1.1)
#f
> (= 1.1 1.1)
#t
这是 DrScheme 中的交互窗口。有人可以解释=和eq之间的区别吗?在方案中?
【问题讨论】:
eq?、equal?和eqv?之间的区别
= 比较数字。情商?测试参数是否代表内存中的相同数据对象。当量?应该在第二种情况下工作,因为它测试与 eq 相同?但专门测试原语。 More on equlivence predicates in scheme here.
【讨论】:
我猜是因为
当量?评估为 #f 除非它的 参数代表相同的数据 内存中的对象;
和
Scheme 存储不精确的数字 (1.1) 不同于确切的数字 (1)
两个 1.1 的参数不在内存中的同一个位置并返回#f for eq?
【讨论】:
eq? 在数字上是不可预测的。是否嵌入数字文字以使相同的数字位于内存中的相同位置取决于实现与否。例如,Racket 语言最近选择在阅读过程中实习这些文字。 http://www.mail-archive.com/dev@racket-lang.org/msg04893.html
您无法确定您的语言实现的运行时是否会唯一地表示每个数字。这会影响被装箱的值,例如浮点数和大数。这就是为什么 = 作为数字谓词存在的原因:它检查内容的相等性,而不是浅指针相等性。
这并不是像 Scheme 这样的语言所独有的:例如,Python 中会出现相等与相等(is vs. ==)。
【讨论】:
第一个区别:eq? 适用于任意一对值,而= 适用于任意数量的数字。
还有其他几个equivalence predicates。他们中的大多数只接受两个参数。 = 定义在 'numbers' chapter
【讨论】: