首页 > 解决方案 > 解释为什么这个球拍语言代码中的 x 值没有更新?

问题描述

这段代码:

(let ((x 2)) (let((f (lambda (n)(+ x n )))) (let (( x 17)) (f 3 ))))

给我答案 5,为什么 x 值没有从 2 更新到 17?

标签: racket

解决方案


词汇范围的魔力。

这是一个带有评论的版本:

(let ((x 2))
  ; x is bound to 2
  (let ((f (lambda (n) (+ x n))))
    ; f is bound to a function that adds `x` and a number `n`
    (let ((x 17)) (f 3))))
    ; Bind `x` to 17, call (f 3) in the body.

在第三行中,namex绑定到 17。但是前面let已经绑定f了 add2和一个新的 number n。这证明了相同的想法:

(let ((f (λ (n) (+ 2 n))))
  (let ((x 17)) (f 3)))

推荐阅读