在我的大学里,我们不得不和 Racket 一起工作,因为我有点喜欢它,所以我从 No Starch 那里买了最近出版的书“Realm Of Racket”。
到目前为止很好,但是,当他们试图解释eq? 作品:
- 起初,他们解释如何平等?比较两个值是否由相同的部分组成。好的,没问题,我明白了:相等?与 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?是在做。也许我错了,它与参考没有任何关系......
如果有人知道这一点,请分享您的智慧;)