Racket 解释x值在此球拍语言代码中未更新的原因?
此代码:Racket 解释x值在此球拍语言代码中未更新的原因?,racket,Racket,此代码: (let((x2))(let((f(lambda(n)(+xn)))(let((x17))(f3))) 答案是5,为什么x值没有从2更新到17?的魔力 以下是一个带有注释的版本: (let((x 2)) ;x与2绑定 (设((f(λ(n)(+xn))) ;f绑定到一个函数,该函数将'x'和一个数字'n'相加` (让((x17))(f3))) ; 将'x'绑定到17,在体内调用(f3)。 在第三行中,名称x绑定到17。但是前面的let已经绑定了f以添加2和一个新的数字n。这表明了同样
(let((x2))(let((f(lambda(n)(+xn)))(let((x17))(f3)))
答案是5,为什么x值没有从2更新到17?的魔力
以下是一个带有注释的版本:
(let((x 2))
;x与2绑定
(设((f(λ(n)(+xn)))
;f绑定到一个函数,该函数将'x'和一个数字'n'相加`
(让((x17))(f3)))
; 将'x'绑定到17,在体内调用(f3)。
在第三行中,名称x
绑定到17。但是前面的let
已经绑定了f
以添加2
和一个新的数字n
。这表明了同样的想法:
(let((f(λ(n)(+2n)))
(让((x17))(f3)))
稍后将x绑定到17是不相关的,因为在编写f的环境中,x绑定到2。在计算函数调用时,请始终查看函数定义的环境,而不是函数调用的环境。@YAwwad词法范围-定义lambda/函数时,x“捕获”lambda-2可见的x。因此,f
是由这个函数体使用x=2
定义的。非常感谢您的解释。这个问题出现在我的测验中