0

对于每个 100% 兼容的不依赖于任何特定于实现或未定义行为的 R7RS 小程序,是否letrec可以替换程序中的每个实例letrec*而不会导致任何行为变化?换句话说,是否有任何 R7RS 小程序的外观letrec不能替换为letrec*

4

1 回答 1

1

我认为答案是肯定的,它可以,假设表格在 R7RS 术语中不是“错误”(但请参阅末尾的注释)。特别是我认为如果有这样的形式

(letrec ((v1 <e1>) (v2 <e2>)) ...)

然后必须可以在<e2>不引用 的值的情况下进行评估,但是在评估时v1该绑定确实存在<e2>:引用它只是一个错误。因此,特别是不允许这样做:

(let ((a 1)) (letrec ((a 2) (b a)) ...))

因为 initb所指的绑定是由 建立的letrec而不是由 建立的let,但引用该绑定的值尚不合法。

既然如此,那么如果您只是简单地替换letrecthenletrec*仍然<e2>不会引用 of 的值,v1因此结果将是相同的。

反之则不成立:

(letrec* ((a 1) (b a)) ...)

很好,但你不能在letrec*那里替换letrec

在这种情况下,我不清楚有什么有用的目的letrec(也许这就是为什么 Racketletrec具有 Scheme 的语义letrec*)。


请注意,此答案的早期版本得出了相反的结论。我现在不相信我对事物的理解足够好。

于 2021-12-01T14:53:22.197 回答