Scheme 什么';R6RS和x27之间的区别是什么;s`letrec`、`letrec*`和Racket';s'letrec`?

Scheme 什么';R6RS和x27之间的区别是什么;s`letrec`、`letrec*`和Racket';s'letrec`?,scheme,racket,r6rs,letrec,Scheme,Racket,R6rs,Letrec,letrec和letrec*都在R6RS中,但球拍中有letrec,没有letrec*。这两者之间有什么区别?在短拍letrec中,R6RSletrec*是相同的。 为这些指定了评估顺序。 在R5RSletrec中,未指定顺序 由于R5RSletrec的顺序未指定,因此实现可以选择 一个固定的顺序(例如从左到右),或者他们可以让编译器 为每次使用选择不同的顺序(以获得更快的代码) 从球拍文档中 : 语义:s绑定到新的位置 未定义的值,s在结果中进行计算 环境(以一些未指定的顺序),每个都被赋值

letrec
letrec*
都在R6RS中,但球拍中有
letrec
,没有
letrec*
。这两者之间有什么区别?

在短拍
letrec
中,R6RS
letrec*
是相同的。 为这些指定了评估顺序。 在R5RS
letrec
中,未指定顺序

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

从球拍文档中

:

语义:s绑定到新的位置 未定义的值,s在结果中进行计算 环境(以一些未指定的顺序),每个都被赋值 对于相应的结果,在 生成的环境,以及中最后一个表达式的值 返回。的每个绑定都具有整个 将letrec表达式作为其区域,使相互定义成为可能 递归过程

:

与let类似,包括从左到右计算val表达式,但 首先创建所有ID的位置,并用#填充, 所有id都绑定在所有val表达式以及Body中,每个id 在计算相应的val expr后立即设置。这个 根据绑定标识符=?,ID必须是不同的

:

语义:s绑定到新的位置,每个 按从左到右的顺序分配给 通过计算相应的,将在中计算 结果环境,以及中最后一个表达式的值 他们回来了。尽管有从左到右的评估和分配 顺序,的每个绑定都具有整个letrec*表达式 作为其区域,使定义相互递归成为可能 程序


为了完整起见,您可能需要添加R7RS语义,因为R7RS现在是正式的。据我所知,R7RS中的letrec和letrec*的含义没有变化。也就是说,R7RS中的letrec与R5RS和R6RS中的含义相同。在R7RS中,letrec*与R6RS中的含义相同。