为什么 Scheme 需要程序位置标签的特殊概念?



Scheme为什么需要过程位置标记的特殊概念?
标准是:

作为lambda表达式求值的结果创建的每个过程(在概念上)用存储位置标记,以便使 eqv吗?和情商?工作程序

eqv吗?过程返回#t如果:

  • obj1和obj2是位置标签相等的过程

情商?和eqv吗?保证在…上有相同的行为。程序…

但同时:

变量和对象(如对、向量和字符串)隐式地表示位置或位置序列

eqv吗?过程返回#t如果:

  • obj1和obj2是表示存储
  • 中相同位置的对、向量或字符串。

情商?和eqv吗?保证在…上有相同的行为。对…非空字符串和向量

为什么不直接将"隐式表示位置或位置序列"应用到过程中呢?
我想这也和他们有关。
我看不出程序有什么特别之处

对、向量和字符串是可变的。因此,这些对象的身份(或位置)很重要。

过程是不可变的,因此它们可以被任意复制或合并,而在行为上没有明显的差异。在实践中,这意味着一些优化编译器可以内联它们,有效地使它们成为"多个副本"。R6RS特别指出,对于像

这样的表达式
(let ((p (lambda (x) x)))
  (eqv? p p))

结果不能保证为真,因为它可以被内联为(eqv? (lambda (x) x) (lambda (x) x))

R7RS的位置标签的概念是保证该表达式确实产生true,即使实现使用内联。

将过程视为值在ML等语言中有效,因为它们是真正不可变的。但是在Scheme中,过程实际上是可以改变的,因为它们的局部变量是可以改变的。实际上,过程是穷人的对象(尽管也可以认为oo风格的对象只是穷人的过程!)位置标签的作用与对象标识相同,用于区分具有相同汽车和cdr的两对。

特别地,给予全局过程同一性意味着可以直接问我们传递的谓词是否特别相等?还是eqv ?或等于多少?

,这在R6RS中是不可移植的(尽管在实践中R6RS实现是可能的)。

相关内容

  • 没有找到相关文章

最新更新