【问题标题】:Petite Chez Scheme (threaded) what is the difference between the two lists?Petite Chez Scheme (threaded) 这两个列表有什么区别?
【发布时间】:2013-10-23 07:05:36
【问题描述】:

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

【问题讨论】:

标签: scheme chez-scheme


【解决方案1】:

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

 (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 的情况下,这也是汽车指向的位置,因此您可以更改两者。在myq 中,carcdr 都指向它们自己的内存位置,并加载了值'ignored。

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

【讨论】:

  • 我喜欢这里的代码示例。不过,展示它如何应用于结构可能会很好。例如,(define example (cons 1 2)) (equal? example (cons 1 2)) (set-car! ...) ....
【解决方案2】:

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

  • 一个 cons 单元格分别在 carcdr 中包含 ignored()
  • 另一个 cons 单元格在其 carcdr 中包含指向第一个 cons 单元格的链接。

当您执行 (set-car! (cdr myqq) 'b) 时,您将第一个 cons 单元格的 car(因为这是在 (cdr myqq) 中引用的内容)从 ignored 更改为 b

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

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

>>> (eq? (car myqq) (cdr myqq))
#t 
>>> (eq? (car myq) (cdr myq))
#f 

【讨论】:

  • 但是myq和myqq有什么区别呢?因为通过equal?他们是一样的。
  • @Pythoner 不,它们不一样,只是在那一刻它们具有相等的值。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多