列表的 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)) ; ==> #t
和 eqv?
和 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?
而在报告中不能保证的原因。
我正在为 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?
和相同原始值(数字,字符) 的所有内容都是 equal?
是#t
对于所有eqv?
和看起来相同的值
#t
cdr
是访问器。 (cdr l)
将 return 相同的指针,因此 (eq? (cdr l) (cdr l)) ; ==> #t
和 eqv?
和 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?
而在报告中不能保证的原因。