0

在 Petite Chez 计划(线程)中。我定义了两个名为 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的车!

4

2 回答 2

2

平等的?不代表相同。平等基本上问这两个东西值吗?如果是,它们是一样的吗?如果它们是值列表,这些列表的每个元素是否具有与相应列表相同的值。

 (define example 'ignored) 
 (equal? 'ignored example) -> #t  
 (set! example 'b) 
 (equal? 'ignored example) -> #f 

这是有道理的,对吧?

这与 cons 单元是一对指针这一事实有关。

当您定义时,myqq您将名称绑定end到值'ignored,其内部是一个符号,与指向某个内存位置的指针相关联,值'ignored。返回 的值时myqq,它是一个指向一个pair的名字,这个pair是两个指针,都指向end的指针指向的同一个地方。set-cdr!更改 cdr 指针指向的位置的内存值。在这种情况下,myqq这也是汽车指向的位置,因此您可以更改两者。在andmyq中,每个都指向自己的内存位置,加载了值 'ignored。carcdr

正如 svk 所指出的,eq?将通过比较指针来测试相等性。

于 2013-10-23T14:09:08.530 回答
1

结果make-queue是一个由两个cons 单元组成的结构,而不是三个:

  • 一个 cons 单元格分别包含ignoredand和()in 。carcdr
  • 另一个 cons 单元格在其car和 its中都包含指向第一个 cons 单元格的链接cdr

当你这样做时(set-car! (cdr myqq) 'b),你正在将car第一个 cons 单元格(因为这是在 中引用的(cdr myqq))从ignored更改为b

equal?递归检查对和类似结构,最终应用于eqv?原始值(在您的情况下为符号)。它并没有将 中的不同组件之间存在结构共享这一事实计算在内myqq,而对于 来说,情况并非如此myq,作为相关差异。

equal?不是关于平等的最终决定,它只是一种特殊的(并且通常有用的)意义,其中两个结构可以平等。您可以使用其他比较函数来查看两种结构之间的差异,例如:

>>> (eq? (car myqq) (cdr myqq))
#t 
>>> (eq? (car myq) (cdr myq))
#f 
于 2013-10-23T07:28:41.923 回答