1

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

作为评估 lambda 表达式的结果而创建的每个过程(在概念上)都标记有存储位置,以便生成 eqv? 和情商?程序工作

eqv? 过程返回 #t 如果:

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

情商?和eqv?保证在...程序上具有相同的行为...

但同时:

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

eqv? 过程返回 #t 如果:

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

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

为什么不将“隐式表示位置或位置序列”也应用于程序呢?
我认为这也与他们有关,我认为这方面的
程序没有什么特别之处

4

2 回答 2

4

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

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

(let ((p (lambda (x) x)))
  (eqv? p p))

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

R7RS 的位置标签概念是为了确保该表达式确实导致 true,即使实现进行内联也是如此。

于 2014-05-03T03:27:20.453 回答
1

将过程视为值在像 ML 这样的语言中是有效的,因为它们是真正不可变的。但在 Scheme 中,过程实际上可以被变异,因为它们的局部变量可以。实际上,程序是穷人的对象(尽管也可以说 OO 风格的对象只是穷人的程序!) 位置标记与区分具有相同汽车和 cdr 的两对的对象身份具有相同的目的。

特别是,给全局过程标识意味着可以直接询问我们已通过的谓词是否具体为 eq? 或eqv?或等于?,这在 R6RS 中是不可移植的(尽管在实践中可能在 R6RS 实现中)。

于 2014-07-05T17:20:48.770 回答