letrec和letrec*都在R6RS,但球拍里有仅限 letrec,没有letrec*。它们之间有什么区别呢?
发布于 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*表达式作为其区域,从而可以定义相互递归的过程。
https://stackoverflow.com/questions/20440688
复制相似问题