(define x 2)
(let ((x 1) (y (+ x 1))) (+ x y))
你得到4;
(let* ((x 1) (y (+ x 1))) (+ x y))
你得到3。
我不明白let
的工作原理。有人可以解释一下,我是计算机科学的新手,谢谢
答案 0 :(得分:3)
(let ((x 0) (z x))
...)
相当于:
((lambda (x z) ...) 0 x)
也许在匿名过程调用中你可以看到,当评估参数时,体内的变量还不存在,但是体内x
是0
和前一个{{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)))
...)
,那么let
和sqa
将无法使用!
经验法则是使用sqb
并在需要引用同一let
中绑定的内容时将其更改为let*
。小心不要影响以后使用的变量。