我正在为R7RS计划编写解释器,以更全面地了解Scheme编程语言。
据我了解,如果两个列表参数都表示内存中的相同位置,则eqv?
必须返回#t
。但是,我不确定列表的cdr
是否必须始终为eqv:
(define l '(a b c))
(eqv? (cdr l) (cdr l)) ; #t of #f?
我所缺少的部分是,特定列表的cdr
是否必须始终指向特定位置。对于特定列表,cdr
是否必须始终在列表上每次调用时都返回相同的子列表,还是可以返回一个全新的子列表?
(我知道我可以使用现有的Scheme解释器进行经验测试,但是我主要对标准要求具有兴趣)。
答案 0 :(得分: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时,其余位根本不是位置,而是指针中嵌入的数字。这样,您可以拥有使用6个单词的列表(1 2 3)
。 3对,每对2个单词,但当它们适合61位大小时,不占用数字的内存。这就是为什么数字和字符经常被eq?
而不在报告中得到保证的原因。