letrec
和letrec*
都在R6RS中,但在Racket中有only letrec
,没有letrec*
。这些之间有什么区别?
答案 0 :(得分:8)
简而言之,球拍letrec
和R6RS letrec*
是相同的。
为这些指定了评估顺序。
在R5RS letrec
中,订单未指定。
由于R5RS letrec
的顺序未指定,实现可以选择
固定的顺序(例如从左到右)或者他们可以让编译器
为每次使用选择不同的订单(为了获得更快的代码)。
来自Racket文档。
语义:<变量> s绑定到保持的新位置 未定义的值,<在结果中评估init> s 环境(以某种未指定的顺序),每个<可变>被安排了 到对应的结果< init>,<体>评估 生成的环境,以及最后一个表达式的值 <体>是(是)返回。每个绑定的<可变>有整个 letrec表达式作为其区域,可以相互定义 递归程序。
就像让,包括从左到右的val-exprs评估,但是 首先创建所有ID的位置,并用#<未定义>中 所有id都绑定在所有val-exprs以及bodys和每个id中 在评估相应的val-expr之后立即设置。该 根据bound-identifier =?。
,id必须是不同的
语义:<变量> s被绑定到新的位置 <可变>按从左到右的顺序分配给结果 评估相应的< init>,<体>评估在 结果环境,以及<中的最后一个表达式的值体> 被退回。尽管从左到右评估和分配 顺序,每个绑定<可变>有整个letrec *表达式 作为其区域,可以定义相互递归 程序