首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R6RS的“`letrec”、“`letrec*”和球拍的“`letrec”有什么区别?

R6RS的“`letrec”、“`letrec*”和球拍的“`letrec”有什么区别?
EN

Stack Overflow用户
提问于 2013-12-07 11:17:32
回答 1查看 806关注 0票数 5

letrecletrec*都在R6RS,但球拍里有仅限 letrec,没有letrec*。它们之间有什么区别呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-07 14:29:30

简而言之,球拍letrec和R6RS letrec*是一样的。为此指定了计算顺序。在R5RS letrec中,顺序未指定。

由于R5RS letrec的顺序是未指定的,所以实现可以选择固定的顺序(例如,从左到右),或者让编译器为每种使用选择不同的顺序(以获得更快的代码)。

从球拍的文件上。

R5RS letrec

语义:< variable>s绑定到保存未定义值的新位置,< init>s在结果环境中进行计算(按某些未指定的顺序),每个< variable>分配给相应的< init>的结果,< body>在结果环境中进行计算,并返回< body> ()中最后一个表达式的值。< variable>的每个绑定都将整个letrec表达式作为其区域,从而可以定义相互递归的过程。

球拍球拍

就像let一样,包括从左到右的val-exprs计算,但是所有id的位置都是首先创建的,并且填充了#< undefined>,所有id都绑定在所有的val-exprs以及主体中,并且每个id都是在计算相应的val-expr之后立即设置的。根据绑定标识符=?,ids必须是不同的。

letrec*

语义:< variable>s绑定到新的位置,每个< variable>按从左到右的顺序分配给相应的< init>,< body>在结果环境中计算,并返回< body>中最后一个表达式的值。尽管有从左到右的计算和赋值顺序,但< variable>的每个绑定都将整个letrec*表达式作为其区域,从而可以定义相互递归的过程。

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

https://stackoverflow.com/questions/20440688

复制
相关文章

相似问题

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