混淆 Let 和 Let* 的方案
Posted
技术标签:
【中文标题】混淆 Let 和 Let* 的方案【英文标题】:Scheme Confusing of Let and Let* 【发布时间】:2011-12-23 14:58:12 【问题描述】:(let ((x 2) (y 3)
(let ((x 7)
(z (+ x y)))
(* z x)))
使用上面的代码,为什么答案是 35 而不是 70?在第二个let
中,x 是 7,所以 z 应该是 7 + 3 = 10,然后结果应该是 7 * 10 = 70。我知道有另一个是 let* 我在这 2 之间很困惑。示例是从谷歌抓取。我已经谷歌了,但就是无法得到它。
【问题讨论】:
【参考方案1】:扩展 Leppie 的回答:如果你写过
(let ((x 2) (y 3))
(let* ((x 7)
(z (+ x y)))
(* z x)))
你会得到你期望的答案。内部let*
完全等价于
(let ((x 7))
(let ((z (+ x y)))
(* z x)))
实际上可能在某些方案中以这种方式实现。
换句话说,在let*
表单中,第一个绑定之后的每个后续绑定都在所有先前创建的绑定的范围内。
【讨论】:
【参考方案2】:x
在调用(+ x y)
时仍然绑定到外部let
。
【讨论】:
以上是关于混淆 Let 和 Let* 的方案的主要内容,如果未能解决你的问题,请参考以下文章
在没有嵌套 let 的情况下在 Clojure 中绑定多个相关变量