Petite Chez Scheme(线程)这两个列表有什么区别?

时间:2013-10-23 07:05:36

标签: scheme chez-scheme

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的车!

2 个答案:

答案 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 carcdr每个都指向他们自己的内存位置,其中加载了值'ignored。

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

答案 1 :(得分:1)

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

  • 一个缺点单元格分别包含ignored()中的carcdr
  • 另一个cons单元格包含指向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