Scheme Petite Chez方案(线程化)这两个列表之间的区别是什么?
在小Chez方案中(螺纹)。我定义了两个名为myq和myqq的列表Scheme Petite Chez方案(线程化)这两个列表之间的区别是什么?,scheme,chez-scheme,Scheme,Chez Scheme,在小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? my
(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)
。我认为这应该会导致((忽略)b)
,因为我们从不更换myqq的车 生成队列的结果是一个由两个cons单元组成的结构,而不是三个:
- 一个cons单元格分别在
和汽车
中包含被忽略的cdr
和
()
- 另一个cons单元包含到其
和car
中的第一个cons单元的链接cdr
(设置汽车!(cdr myqq)'b)
时,您正在将第一个cons单元的汽车
从忽略
更改为b
equal?
递归检查对和类似结构,最终将eqv?
应用于基本值(在您的示例中是符号)。它没有考虑到在myqq
中不同组件之间存在结构共享这一事实,而对于myq
,这并不是一个相关的差异
equal?
并不是平等的最终定义,它只是两个结构可以相等的一种特殊意义(通常是有用的)。您可以使用其他比较函数查看两种结构之间的差异,例如:
>>> (eq? (car myqq) (cdr myqq))
#t
>>> (eq? (car myq) (cdr myq))
#f
make queue
的结果是一个由两个cons单元格组成的结构,而不是三个:
- 一个cons单元格分别在
和汽车
中包含被忽略的cdr
和
()
- 另一个cons单元包含到其
和car
中的第一个cons单元的链接cdr
(设置汽车!(cdr myqq)'b)
时,您正在将第一个cons单元的汽车
从忽略
更改为b
equal?
递归检查对和类似结构,最终将eqv?
应用于基本值(在您的示例中是符号)。它没有考虑到在myqq
中不同组件之间存在结构共享这一事实,而对于myq
,这并不是一个相关的差异
equal?
并不是平等的最终定义,它只是两个结构可以相等的一种特殊意义(通常是有用的)。您可以使用其他比较函数查看两种结构之间的差异,例如:
>>> (eq? (car myqq) (cdr myqq))
#t
>>> (eq? (car myq) (cdr myq))
#f
make queue
的结果是一个由两个cons单元格组成的结构,而不是三个:
- 一个cons单元格分别在
和汽车
中包含被忽略的cdr
和
()
- 另一个cons单元包含到其
和car
中的第一个cons单元的链接cdr
(设置汽车!(cdr myqq)'b)
时,您正在将第一个cons单元的汽车
从忽略
更改为b
equal?
递归检查对和类似结构,最终将eqv?
应用于基本值(在您的示例中是符号)。它没有考虑到在myqq
中不同组件之间存在结构共享这一事实,而对于myq
,这并不是一个相关的差异
equal?
并不是平等的最终定义,它只是两个结构可以相等的一种特殊意义(通常是有用的)。您可以使用其他比较函数查看两种结构之间的差异,例如:
>>> (eq? (car myqq) (cdr myqq))
#t
>>> (eq? (car myq) (cdr myq))
#f
make queue
的结果是一个由两个cons单元格组成的结构,而不是三个:
- 一个cons单元格分别在
和汽车
中包含被忽略的cdr
和
()
- 另一个cons单元包含到其
和car
中的第一个cons单元的链接cdr
(设置汽车!(cdr myqq)'b)
时,您正在将第一个cons单元的汽车
从忽略
更改为b
equal?
递归检查对和类似结构,最终将eqv?
应用于基本值(在您的示例中是符号)。它没有考虑到在myqq
中不同组件之间存在结构共享这一事实,而对于myq
,这并不是一个相关的差异
equal?
并不是平等的最终定义,它只是两个结构可以相等的一种特殊意义(通常是有用的)。您可以使用其他比较函数查看两种结构之间的差异,例如:
>>> (eq? (car myqq) (cdr myqq))
#t
>>> (eq? (car myq) (cdr myq))
#f
平等?并不意味着完全相同。基本上相等的问题是这两件事有价值吗?如果是的话,它们是一样的吗?如果它们是值列表,那么这些列表中的每个元素是否与对应的列表具有相同的值
(define example 'ignored)
(equal? 'ignored example) -> #t
(set! example 'b)
(equal? 'ignored example) -> #f
这是有道理的,对吗
这与cons单元格是一对指针这一事实有关
定义myqq
时,将名称end
绑定到值'ignored',该值在内部是一个符号,与指向某个内存位置的指针关联,该值为'ignored'。当返回myqq
的值时,它是指向一对的名称,这对是两个指针,都指向end指针指向的同一个位置<代码>设置cdr代码>c