eq之间的区别?和=在Scheme?

时间:2009-06-02 20:44:59

标签: scheme racket

    > (eq? 1 1)
    #t
    > (eq? 1.1 1.1)
    #f
    > (= 1.1 1.1)
    #t

这是DrScheme中的交互窗口。有人可以解释一下=和eq之间的区别吗?在Scheme?

4 个答案:

答案 0 :(得分:9)

=比较数字。情商?测试参数是否代表内存中的同一数据对象。 EQV?应该在第二种情况下工作,因为它测试与eq相同?但特别测试原语。 More on equlivence predicates in scheme here

答案 1 :(得分:3)

我猜是因为

  

当量?评估#f除非它   参数表示相同的数据   记忆中的对象;

  

Scheme存储不精确的数字(1.1)   与确切的数字不同(1)

两个1.1参数不在内存中的相同位置,并返回#f for eq?

Wikipedia Reference

答案 2 :(得分:3)

数字

eq?是不可预测的。是否实现取决于数字文字是否被内插,以便相同的数字位于内存中的相同位置。例如,Racket语言最近选择在阅读期间实习这样的文字。 http://www.mail-archive.com/dev@racket-lang.org/msg04893.html

您无法确定您的语言实现的运行时是否唯一地代表每个数字。这可能会影响装箱的值,如浮动和bignums。这就是为什么 = 作为数字的谓词存在的原因:它检查内容的等价性,而不是浅指针等式。

这不是像Scheme这样的语言所独有的:例如,在Python中出现了相等与平等( == )。

答案 3 :(得分:1)

第一个区别:eq?适用于任何一对值,而=适用于任意数量的数字。

还有其他几个equivalence predicates。他们中的大多数只接受两个参数。 =

中定义了{{1}}