对于每个 100% 兼容的不依赖于任何特定于实现或未定义行为的 R7RS 小程序,是否letrec
可以替换程序中的每个实例letrec*
而不会导致任何行为变化?换句话说,是否有任何 R7RS 小程序的外观letrec
不能替换为letrec*
?
问问题
52 次
1 回答
1
我认为答案是肯定的,它可以,假设表格在 R7RS 术语中不是“错误”(但请参阅末尾的注释)。特别是我认为如果有这样的形式
(letrec ((v1 <e1>) (v2 <e2>)) ...)
然后必须可以在<e2>
不引用 的值的情况下进行评估,但是在评估时v1
该绑定确实存在<e2>
:引用它只是一个错误。因此,特别是不允许这样做:
(let ((a 1)) (letrec ((a 2) (b a)) ...))
因为 initb
所指的绑定是由 建立的letrec
,而不是由 建立的let
,但引用该绑定的值尚不合法。
既然如此,那么如果您只是简单地替换letrec
thenletrec*
仍然<e2>
不会引用 of 的值,v1
因此结果将是相同的。
反之则不成立:
(letrec* ((a 1) (b a)) ...)
很好,但你不能在letrec*
那里替换letrec
。
在这种情况下,我不清楚有什么有用的目的letrec
(也许这就是为什么 Racketletrec
具有 Scheme 的语义letrec*
)。
请注意,此答案的早期版本得出了相反的结论。我现在不相信我对事物的理解足够好。
于 2021-12-01T14:53:22.197 回答