在我的大学里,我们不得不与球拍合作,因为我有点喜欢它,我买了最近出版的书“球拍领域”从没有淀粉。
但是,到目前为止,我还不知道它们在第四章中的意思是什么,当他们试图解释eq的时候?作品:
显然,现在我不明白为什么这不像预期的那样,正因为如此,我看不出什么方程?在做什么。也许我错了,这和推荐信没有任何关系.
如果有人知道这一点,请分享你的智慧;)
发布于 2013-07-10 13:50:57
有关eq?如何工作的技术解释,请看一下当前的规格说明,您将找不到更详细的参考资料。或者简单的检查球拍的文档关于这个主题,特别是程序eq?,eqv?和equal?。关于您的问题--结果和预期的一样,在Scheme代码中是正确的,让我们来看看为什么。注意,在Java的这一行中:
p1.x = 42;您正在修改p1和p2都指向的同一个对象。鉴于在这一行:
(set! cons1 (cons 2 empty))您正在创建一个新的、不同的对象,并将cons1设置为指向它,但是cons2仍然指向旧对象。您可以确认这一点,在上一行之后,比较(eq? cons1 cons2)将返回#f。
关键是:这些例子是不对等的。Java示例处理两个不同引用指向的单个对象,而Scheme示例处理两个对象和两个引用。
为了比较起见,下面是一个类似于Java代码的Scheme示例,它的工作方式与您预期的一样,因为在这里,我们修改了一个由两个引用指向的单个可变对象:
#lang racket
(require scheme/mpair) ;; `m` stands for "mutable"
(define p1 (mlist 5 5))
(define p2 p1)
(eq? p1 p2) ;; #t
(mcar p1) ;; 5
(mcar p2) ;; 5
(set-mcar! p1 42)
(eq? p1 p2) ;; #t
(mcar p1) ;; 42
(mcar p2) ;; 42发布于 2013-07-10 16:14:53
阿:你想确保你在改变结构。在您的示例中,它实际上不是改变现有值的结构,而是构造一个全新的值并将cons1指向它。您的概念是正确的:eq?基本上是==。
简单地说,这是Java表单中的错误,您可以看到哪里出了问题:
int[] lst1 = new int[] { 1 }; // (define cons1 (cons 1 empty))
int[] lst2 = lst1; // (define cons2 cons1)
System.out.println(lst1 == lst2); // (eq? cons1 cons2)
lst1 = new int[] { 2 }; // (set! cons1 (cons 2 empty))
System.out.println(lst1[0]); // (list-ref cons1 0)
System.out.println(lst2[0]); // (list-ref cons2 0)实际上,在这一点上,您需要检查eq?-ness的末尾:您将看到这两个值不再是eq?:它们是两个不同的值。
您真正想要的是在结构上执行突变,而不是变量重新绑定。在Racket中,由于列表是不可变的,所以您需要使用允许变异的不同数据结构。向量是一个可以演示的示例数据类型。让我们再来一次“罗塞塔”,这样你就可以看到这个比喻了:
(define vec1 (vector 1)) ;; int[] vec1 = new int[] { 1 };
(define vec2 vec1) ;; int[] vec2 = vec1;
(eq? vec1 vec2) ;; System.out.println(vec1 == vec2);
(vector-set! vec1 0 2) ;; vec1[0] = 2;
(vector-ref vec1 0) ;; System.out.println(vec1[0]);
(vector-ref vec2 0) ;; System.out.println(vec2[0]);https://stackoverflow.com/questions/17572181
复制相似问题