【发布时间】:2013-07-08 11:22:11
【问题描述】:
在我的大学里,我们不得不与 Racket 合作,因为我有点喜欢它,所以我从 No Starch 购买了最近出版的书“Racket 领域”。
到目前为止很好,但是,当他们试图解释 eq? 的工作原理时,我无法弄清楚它们在第 4 章中的含义:
- 首先,他们解释了 equal? 如何比较两个值是否由相同的部分组成。好的,没问题,我明白了: equal? 与 Java 的 equals(someObject) 方法几乎相同。如果两个对象/结构/任何内容相同,则返回 #t。
- 然后,我想,eq? 必须等同于 Java 的 == 运算符,它不比较内容,而是基于引用。
-
这个想法似乎被书中的下面一句话证实了:“eq?比较改变一个结构是否改变另一个结构......” 太好了!让我们将其与以下一段 Java 代码进行比较:
Point p1 = new Point(5, 5); Point p2 = p1; System.out.println(p1 == p2); // true, since the reference has been copied. System.out.println(p1.x); // 5 System.out.println(p2.x); // 5 p1.x = 42; System.out.println(p1.x); // 42 System.out.println(p2.x); // Accordingly, 42让我们在 Racket 中试试这个:
(define cons1 (cons 1 empty)) (define cons2 cons1) (eq? cons1 cons2) ;; #t, since the refernce has been copied. (set! cons1 (cons 2 empty)) cons1 ;; Returns '(2) - as expected. cons2 ;; Still returns '(1).为什么? cons2 指向 cons1,它本身指向 '(2)。另外,他们不是说一换一换就平等吗?
显然,现在我不明白为什么它的行为不像预期的那样,因此,我看不到 eq? 在做什么。也许我错了,它与引用没有任何关系......
如果有人知道这一点,请分享你的智慧;)
【问题讨论】: