【发布时间】:2015-02-10 09:25:10
【问题描述】:
(define x 2)
(let ((x 1) (y (+ x 1))) (+ x y))
你得到 4 个;
(let* ((x 1) (y (+ x 1))) (+ x y))
你得到 3 个。
我不明白let 的工作原理。有人可以解释一下吗,我是计算机科学的新手,谢谢
【问题讨论】:
(define x 2)
(let ((x 1) (y (+ x 1))) (+ x y))
你得到 4 个;
(let* ((x 1) (y (+ x 1))) (+ x y))
你得到 3 个。
我不明白let 的工作原理。有人可以解释一下吗,我是计算机科学的新手,谢谢
【问题讨论】:
(let ((x 0) (z x))
...)
相当于:
((lambda (x z) ...) 0 x)
也许在匿名过程调用中你可以看到,在计算参数时,主体内部的变量还不存在,但主体内部x 是0,而之前的x 整体被遮蔽了正文,但可通过z 访问。
(let* ((x 0) (z x))
...)
相当于:
(let ((x 0))
(let ((z x))
...))
看到这个,您会立即看到 x 被设置为 0 并在 z 被绑定时遮蔽任何其他 x。
假设您要计算三角形的小边:
(let ((hypotenuse (sqrt (+ (square a) (square b)))))
...)
您想将其拆分一下,因此将其更改为 let*,如下所示:
(let* ((sqa (square a))
(sqb (square b))
(hypotenuse (sqrt sqa sqb)))
...)
如果您使用过let,那么sqa 和sqb 将不可用!
经验法则是使用let 并将其更改为let*,当您需要引用绑定在同一let 中的内容时。请注意不要隐藏您以后使用的变量。
【讨论】: