Racket let和let的区别是什么,我不明白这个(球拍)
你得到4分Racket let和let的区别是什么,我不明白这个(球拍),racket,let,Racket,Let,你得到4分 (define x 2) (let ((x 1) (y (+ x 1))) (+ x y)) 你得到3分 我不明白let是如何工作的。有人能解释一下吗,我是计算机科学新手,谢谢 (let* ((x 1) (y (+ x 1))) (+ x y)) 相当于: (let ((x 0) (z x)) ...) (let* ((x 0) (z x)) ...) 也许在匿名过程调用中,您可以看到,当对参数求值时,主体内的变量还不存在,但主体内的x是0,前面的x在整个主体中被隐
(define x 2)
(let ((x 1) (y (+ x 1))) (+ x y))
你得到3分
我不明白let是如何工作的。有人能解释一下吗,我是计算机科学新手,谢谢
(let* ((x 1) (y (+ x 1))) (+ x y))
相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
也许在匿名过程调用中,您可以看到,当对参数求值时,主体内的变量还不存在,但主体内的x
是0
,前面的x
在整个主体中被隐藏,但可以作为z
访问
((lambda (x z) ...) 0 x)
这相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
查看此图,您会立即看到x
设置为0
,并在z
绑定时对任何其他x
进行阴影处理
假设您要计算三角形的假设:
(let ((x 0))
(let ((z x))
...))
您希望将其拆分一点,以便将其更改为let*
,如下所示:
(let ((hypotenuse (sqrt (+ (square a) (square b)))))
...)
如果您想使用let
,那么sqa
和sqb
将不可用!
经验法则是使用let
并在需要引用绑定在同一let
中的内容时将其更改为let*
。注意不要对以后使用的变量进行阴影处理
相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
也许在匿名过程调用中,您可以看到,当对参数求值时,主体内的变量还不存在,但主体内的x
是0
,前面的x
在整个主体中被隐藏,但可以作为z
访问
((lambda (x z) ...) 0 x)
这相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
查看此图,您会立即看到x
设置为0
,并在z
绑定时对任何其他x
进行阴影处理
假设您要计算三角形的假设:
(let ((x 0))
(let ((z x))
...))
您希望将其拆分一点,以便将其更改为let*
,如下所示:
(let ((hypotenuse (sqrt (+ (square a) (square b)))))
...)
如果您想使用let
,那么sqa
和sqb
将不可用!
经验法则是使用let
并在需要引用绑定在同一let
中的内容时将其更改为let*
。注意不要对以后使用的变量进行阴影处理
相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
也许在匿名过程调用中,您可以看到,当对参数求值时,主体内的变量还不存在,但主体内的x
是0
,前面的x
在整个主体中被隐藏,但可以作为z
访问
((lambda (x z) ...) 0 x)
这相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
查看此图,您会立即看到x
设置为0
,并在z
绑定时对任何其他x
进行阴影处理
假设您要计算三角形的假设:
(let ((x 0))
(let ((z x))
...))
您希望将其拆分一点,以便将其更改为let*
,如下所示:
(let ((hypotenuse (sqrt (+ (square a) (square b)))))
...)
如果您想使用let
,那么sqa
和sqb
将不可用!
经验法则是使用let
并在需要引用绑定在同一let
中的内容时将其更改为let*
。注意不要对以后使用的变量进行阴影处理
相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
也许在匿名过程调用中,您可以看到,当对参数求值时,主体内的变量还不存在,但主体内的x
是0
,前面的x
在整个主体中被隐藏,但可以作为z
访问
((lambda (x z) ...) 0 x)
这相当于:
(let ((x 0) (z x))
...)
(let* ((x 0) (z x))
...)
查看此图,您会立即看到x
设置为0
,并在z
绑定时对任何其他x
进行阴影处理
假设您要计算三角形的假设:
(let ((x 0))
(let ((z x))
...))
您希望将其拆分一点,以便将其更改为let*
,如下所示:
(let ((hypotenuse (sqrt (+ (square a) (square b)))))
...)
如果您想使用let
,那么sqa
和sqb
将不可用!
经验法则是使用let
并在需要引用绑定在同一let
中的内容时将其更改为let*
。注意不要对以后使用的变量进行阴影处理