列表的 cdr 总是 eqv 吗?

Is the cdr of a list always eqv?

我正在为 R7RS Scheme 编写解释器,以更全面地了解 Scheme 编程语言。

根据我的理解,如果两个列表参数表示内存中的相同位置,eqv? 必须 return #t。但是,我不确定列表的 cdr 是否必须始终为 eqv:

(define l '(a b c))
(eqv? (cdr l) (cdr l))  ; #t of #f?

我所缺少的知识是特定列表的 cdr 是否必须始终指向特定位置。对于一个特定的列表,每次在列表上调用它时,必须 cdr 总是 return 一个相同的子列表,或者它可以 return 一个全新的子列表吗?

(我知道我可以使用现有的 Scheme 解释器根据经验对此进行测试,但我主要对标准要求的内容感兴趣)。

  • eq?是指针相等(符号、布尔、空列表)
  • eqv? 对于 eq? 和相同原始值(数字,字符)
  • 的所有内容都是 #t
  • equal?#t 对于所有 eqv? 和看起来相同的值

cdr 是访问器。 (cdr l) 将 return 相同的指针,因此 (eq? (cdr l) (cdr l)) ; ==> #teqv?equal? 也将如此,因为当较低级别的相等谓词时它们被保证 #t是。

请注意,这不是相反的方式。例如。 (equal? "test" "test"); ==> #t(eqv? "test" "test") 可以是 #f#t。不同行为的原因是,如果您在阅读代码时重用常量数据而不是创建新数据。

在指针中存储原始值是很常见的。例如。在 64 位机器上,最后 3 位总是 0,因为我们访问对齐的字。方案实现通常然后编码 0-7 以指示类型,并且通常当它为 0 时,其余位根本不是位置,而不是指针中嵌入的数字。这样你就可以得到一个使用 6 个单词的列表 (1 2 3)。 3 对,每对 2 个单词,但当它们适合 61 位大小时,没有内存用于数字。这就是为什么 numbers 和 char 经常 eq? 而在报告中不能保证的原因。