我正准备进行测试,我注意到了这个问题:
Define an object x so that (eq? (car x) (cdr x)) returns #t
Run Code Online (Sandbox Code Playgroud)
我最初认为这很简单.cdr x
是一个列表,car x
是一个单独的元素,所以我的猜测是将x中的第一个元素作为一个等于x的尾部的列表.所以我想出来了
(define x (list (list 1) 1))
Run Code Online (Sandbox Code Playgroud)
调用car x
在DrRacket结果(list 1)
也是如此cdr x
,但是当我尝试调用(eq? (car x) (cdr x))
的结果是#F.
我到底错过了什么?那么正确的答案是什么?
我们可以得到的东西car
和cdr
是不是一个列表.这是一对.
使用cons
例如:创建对:
(define val (list 1))
(define val-pair (cons val val))
Run Code Online (Sandbox Code Playgroud)
(list (list 1) 1)
,另一方面,等价于(cons (list 1) (list 1))
,其中 list
被称为两次每次,返回在存储器中的新的,单独的对象,虽然保持相等的值.但eq?
只对同一个内存对象返回true .
因此,虽然你的思维是合理的,价值方面的,但这里实际比较的不是价值而是相同,就像记忆对象的"指针等式"一样.