两者letrec
和letrec*
都在 R6RS 中,但只有 letrec
在 Racket 中,没有letrec*
。这些之间有什么区别?
1 回答
总之Racketletrec
和R6RSletrec*
是一样的。为这些指定了评估顺序。在 R5RSletrec
中,未指定顺序。
由于 R5RS 的顺序letrec
是未指定的,实现可以选择固定的顺序(例如从左到右),或者它们可以让编译器为每次使用选择不同的顺序(以获得更快的代码)。
从球拍文档。
语义:<variable> 被绑定到新的位置,包含未定义的值,<init> 在结果环境中被评估(以某种未指定的顺序),每个 <variable> 被分配给相应 <init> 的结果, <body> 在生成的环境中进行评估,并返回 <body> 中最后一个表达式的值。<variable> 的每个绑定都将整个 letrec 表达式作为其区域,从而可以定义相互递归的过程。
和 let 一样,包括从左到右对 val-exprs 求值,但首先创建所有 id 的位置并用#< undefined> 填充,所有 id 都绑定在所有 val-exprs 和正文中,并且每个id 在评估相应的 val-expr 后立即设置。根据 bound-identifier=?,ID 必须是不同的。
语义:<variable> 被绑定到新的位置,每个 <variable> 以从左到右的顺序分配给评估相应 <init> 的结果,<body> 在结果环境中评估,并且<body> 中最后一个表达式的值被返回。尽管评估和赋值顺序是从左到右,但 <variable> 的每个绑定都将整个 letrec* 表达式作为其区域,从而可以定义相互递归的过程。