Petite Chez Scheme(线程)。我定义了两个名为myq和myqq的列表。
(define make-queue
(lambda ()
(let ((end (cons 'ignored '())))
(cons end end))))
(define myqq (make-queue))
(define myq '((ignored) ignored))
;this shows myq and myqq are equal
(display (equal? myqq myq))
(newline)
;test myqq
(display myqq)
(newline)
(set-car! (cdr myqq) 'b)
(display myqq)
(newline)
;test myq
(display myq)
(newline)
(set-car! (cdr myq) 'b)
(display myq)
(newline)
这是结果:
#t
((ignored) ignored)
((b) b)
((ignored) ignored)
((ignored) b)
我的问题是:作为
(display (equal? myqq myq))
显示myq和myqq相等。为什么使用相同的命令:
(set-car! (cdr myqq) 'b)
(set-car! (cdr myq) 'b)
导致不同的结果?
另外,我不知道为什么(set-car! (cdr myqq) 'b)
导致((b) b)
。我认为它应该导致((ignored) b)
,因为我们永远不会更改myqq的车!
答案 0 :(得分:2)
等于?并不代表相同。基本上平等问题是这两个值的价值吗?如果是这样的话呢?如果它们是值列表,则这些列表中的每个元素与相应列表具有相同的值。
(define example 'ignored)
(equal? 'ignored example) -> #t
(set! example 'b)
(equal? 'ignored example) -> #f
这是有道理的,对吧?
这与cons细胞是一对指针的事实有关。
定义myqq
时,将名称end
绑定到值'ignored,其内部是一个符号,与指向某个内存位置的指针相关联,值为'ignored。当返回myqq
的值时,它是一个指向一对的名称,这对是两个指针,都指向end指针所指向的相同位置。 set-cdr!
更改cdr指针指向的位置的内存值。在myqq
的情况下,这也是汽车指向的位置,因此您可以更改两者。在myq
car
和cdr
每个都指向他们自己的内存位置,其中加载了值'ignored。
正如svk eq?
所指出的,它将通过比较指针来测试相等性。
答案 1 :(得分:1)
make-queue
的结果是由两个缺点单元组成的结构,而不是三个:
ignored
和()
中的car
和cdr
。car
及其cdr
中第一个cons单元格的链接。当您执行(set-car! (cdr myqq) 'b)
时,您正在更改car
到{{(cdr myqq)
中ignored
引用的第一个cons单元格的b
1}}。
equal?
以递归方式检查对和类似结构,最终将eqv?
应用于原始值(在您的案例符号中)。它不计算myqq
中不同组件之间存在结构共享的事实,myq
的情况并非如此,作为相关差异。
equal?
不是关于平等的最后一个词,它只是一种特殊的(通常是有用的)两种结构可以相等的意义。您可以使用其他比较函数来确定两种结构之间存在差异,例如:
>>> (eq? (car myqq) (cdr myqq))
#t
>>> (eq? (car myq) (cdr myq))
#f