对于每个100%兼容R7RS的小程序,它不依赖于任何特定于实现的或未定义的行为,真的可以用letrec*替换程序中的每个letrec实例,而不会导致任何行为变化吗?换句话说,是否有任何R7RS小程序的外观不能用letrec*替代letrec
发布于 2021-12-01 14:53:22
我认为答案是肯定的,它可以,假设表单在R7RS术语中不是“错误”(但请参见末尾的注释)。特别是,我认为如果有像这样的形式
(letrec ((v1 <e1>) (v2 <e2>)) ...)然后,必须能够在不引用v1的值的情况下评估<e2>,但是当评估<e2>时,该绑定确实存在:引用它只是一个错误。因此,这是特别不允许的:
(let ((a 1)) (letrec ((a 2) (b a)) ...))因为b的初始化引用的绑定是由letrec建立的绑定,而不是由let建立的绑定,但是引用该绑定的值还不合法。
在这种情况下,如果您简单地将letrec替换为letrec*,那么<e2>仍然不会引用v1的值,因此结果将是相同的。
反之亦然:
(letrec* ((a 1) (b a)) ...)没问题,但是你不能在那里用letrec替换letrec*。
在这种情况下,我不清楚letrec服务的有用目的是什么(也许这就是为什么球拍的letrec具有方案的letrec*的语义)。
备注,这个答案的早期版本得出了相反的结论。我现在不相信我对事物的理解足够好。
https://stackoverflow.com/questions/70184399
复制相似问题