0

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

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

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

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

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

4

1 回答 1

2
  • eq?是指针相等(符号、布尔值、空列表)
  • eqv?适用#t于所有eq?相同的原始值(数字、字符)
  • equal?适用于看起来相同#t的所有事物和价值观eqv?

cdr是访问者。(cdr l)将返回相同的指针,因此将返回相同的指针,(eq? (cdr l) (cdr l)) ; ==> #t因为eqv?当较低级别的相等谓词为时,equal?它们得到保证。#t

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

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

于 2019-03-27T21:55:35.090 回答