【问题标题】:What is the difference between let and let*, I dont understand this (Racket) [duplicate]let 和 let* 有什么区别,我不明白这个(球拍)[重复]
【发布时间】: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 的工作原理。有人可以解释一下吗,我是计算机科学的新手,谢谢

【问题讨论】:

    标签: racket let


    【解决方案1】:
    (let ((x 0) (z x))
      ...)
    

    相当于:

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

    也许在匿名过程调用中你可以看到,在计算参数时,主体内部的变量还不存在,但主体内部x0,而之前的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,那么sqasqb 将不可用! 经验法则是使用let 并将其更改为let*,当您需要引用绑定在同一let 中的内容时。请注意不要隐藏您以后使用的变量。

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多