Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables ';让';或';letrec';和';定义';用于创建本地绑定?_Variables_Scope_Scheme_Letrec - Fatal编程技术网

Variables ';让';或';letrec';和';定义';用于创建本地绑定?

Variables ';让';或';letrec';和';定义';用于创建本地绑定?,variables,scope,scheme,letrec,Variables,Scope,Scheme,Letrec,我不明白这两者之间有什么区别(很抱歉有人为的例子): 及 据我所知,它们都创建了一个新的作用域,并在该作用域中创建了4个局部变量,它们相互引用,相互引用,并计算和返回一个主体 我是否在这里遗漏了什么,或者letrec与scopeddefines同义 我知道这可能取决于实施情况;我试图了解Lisps的基本原理。let/letrec和define都将创建局部范围的定义。然而,当您不在begin语句中时,let/letrec更方便。例如,以下代码使用let宏 (define (test) (let (

我不明白这两者之间有什么区别(很抱歉有人为的例子):

据我所知,它们都创建了一个新的作用域,并在该作用域中创建了4个局部变量,它们相互引用,相互引用,并计算和返回一个主体

我是否在这里遗漏了什么,或者
letrec
与scoped
define
s同义


我知道这可能取决于实施情况;我试图了解Lisps的基本原理。

let/letrec和define都将创建局部范围的定义。然而,当您不在begin语句中时,let/letrec更方便。例如,以下代码使用let宏

(define (test) (let ((x 1)) x))
使用本地作用域定义的相同代码将是

(define test (lambda () (define x 1) x))
这是一个精心设计的示例,但通常认为使用let宏进行本地绑定更有效


此外,示例代码没有正确使用letrec。您不需要在letrec声明中定义(事实上它们确实不应该在那里)

您的代码的
define
letrec
版本之间存在相似之处,这是正确的。然而,魔鬼在于细节。在R5RS中。在R6RS中

有什么区别?您的代码实际上刚刚强调了这一差异。正如Zhehao的回答所提到的,您对
total
count
的定义与
length
sum
的定义是不正确的:
length
sum
不保证在您评估
(length elems)
的值时受到约束(sum elems)
,因为这些变量的绑定不能保证从左到右

letrec*
类似于
letrec
,但具有从左到右的保证。因此,如果您将
letrec
更改为
letrec*
,就可以了


现在,回到我最初的评论:因为R5RS的内部
define
使用
letrec
语义,即使是您的
define
版本的代码在R5RS实现下都是不正确的,但在R6RS实现下是可以的,它具有
letrec*
语义。

回答得很好!正如我在answe中提到的r、 在R5RS下,即使是OP代码的
define
版本也是不正确的,不仅仅是
letrec
版本。关于
define
内部
letrec
的好观点一定是我写的时候累了。+1严格地说,
length
sum
保证绑定(到位置);无法保证的是,它们尚未被分配其初始化值。即使它们已被分配,方案也会报告R5R——R7R表示,以初始化子句中对
total
count
的方式引用这些值仍然是一个“错误”。(但是,我不认为需要实现来检测和投诉此错误。)关于差异的更多信息,请参见btw
letrec
/
letrec*
(define (test) (let ((x 1)) x))
(define test (lambda () (define x 1) x))