let和let *有什么区别,我不明白这个(Racket)

时间:2014-12-11 19:10:22

标签: racket let

(define x 2)

(let ((x 1) (y (+ x 1))) (+ x y))

你得到4;

(let* ((x 1) (y (+ x 1))) (+ x y))
你得到3。

我不明白let的工作原理。有人可以解释一下,我是计算机科学的新手,谢谢

1 个答案:

答案 0 :(得分:3)

(let ((x 0) (z x))
  ...)

相当于:

((lambda (x z) ...) 0 x)

也许在匿名过程调用中你可以看到,当评估参数时,体内的变量还不存在,但是体内x0和前一个{{1} }在整个身体中被遮蔽,但可以x访问。

z

相当于:

(let* ((x 0) (z x))
  ...)

观察此信息,您会立即看到(let ((x 0)) (let ((z x)) ...)) 设置为x,并在0被绑定时隐藏任何其他x

想象一下,你想要计算一个三角形的丘脑:

z

您想将其拆分一点,以便将其更改为(let ((hypotenuse (sqrt (+ (square a) (square b))))) ...) ,如下所示:

let*

如果您使用(let* ((sqa (square a)) (sqb (square b)) (hypotenuse (sqrt sqa sqb))) ...) ,那么letsqa将无法使用! 经验法则是使用sqb并在需要引用同一let中绑定的内容时将其更改为let*。小心不要影响以后使用的变量。