R6RS的'letrec`,`letrec *`和Racket的'letrec`有什么区别?

时间:2013-12-07 11:17:32

标签: scheme racket r6rs letrec

letrecletrec*都在R6RS中,但在Racket中有only letrec,没有letrec*。这些之间有什么区别?

1 个答案:

答案 0 :(得分:8)

简而言之,球拍letrec和R6RS letrec*是相同的。 为这些指定了评估顺序。 在R5RS letrec中,订单未指定。

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

来自Racket文档。

R5RS letrec

  

语义:<变量> s绑定到保持的新位置   未定义的值,<在结果中评估init> s   环境(以某种未指定的顺序),每个<可变>被安排了   到对应的结果< init>,<体>评估   生成的环境,以及最后一个表达式的值   <体>是(是)返回。每个绑定的<可变>有整个   letrec表达式作为其区域,可以相互定义   递归程序。

Racket letrec

  

就像让,包括从左到右的val-exprs评估,但是   首先创建所有ID的位置,并用#<未定义>中   所有id都绑定在所有val-exprs以及bodys和每个id中   在评估相应的val-expr之后立即设置。该   根据bound-identifier =?。

,id必须是不同的

R6RS letrec*

  

语义:<变量> s被绑定到新的位置   <可变>按从左到右的顺序分配给结果   评估相应的< init>,<体>评估在   结果环境,以及<中的最后一个表达式的值体>   被退回。尽管从左到右评估和分配   顺序,每个绑定<可变>有整个letrec *表达式   作为其区域,可以定义相互递归   程序