首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否每个letrec都可以替换为letrec*?

是否每个letrec都可以替换为letrec*?
EN

Stack Overflow用户
提问于 2021-12-01 12:41:15
回答 1查看 52关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2021-12-01 14:53:22

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

代码语言:javascript
复制
(letrec ((v1 <e1>) (v2 <e2>)) ...)

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

代码语言:javascript
复制
(let ((a 1)) (letrec ((a 2) (b a)) ...))

因为b的初始化引用的绑定是由letrec建立的绑定,而不是由let建立的绑定,但是引用该绑定的值还不合法。

在这种情况下,如果您简单地将letrec替换为letrec*,那么<e2>仍然不会引用v1的值,因此结果将是相同的。

反之亦然:

代码语言:javascript
复制
(letrec* ((a 1) (b a)) ...)

没问题,但是你不能在那里用letrec替换letrec*

在这种情况下,我不清楚letrec服务的有用目的是什么(也许这就是为什么球拍的letrec具有方案的letrec*的语义)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70184399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档