gpt4 book ai didi

方案范围(定义和让)

转载 作者:行者123 更新时间:2023-12-04 19:11:04 33 4
gpt4 key购买 nike

所以我知道在 Scheme 中,define 用于动态范围,而 let 用于静态范围,但以下事情让我感到困惑:

如果我有

(let ((x 0))
(define f (lambda () x))
(display (f))
(let ((x 1))
(display (f))
)
)

它将显示 00。到目前为止一切顺利。但是,如果我像这样为 x 添加额外的定义:
(let ((x 0))
(define f (lambda () x))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)

它将显示 undefined4。为什么是这样?为什么要定义 x 之后 评估 f 会影响 (f) 的返回值吗?为什么返回值“未定义”?

还值得一提的是,将 f 与 letrec 而不是 define 绑定(bind)也可以:
(let ((x 0))
(letrec ((f (lambda () x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)

返回 00。

注意:我使用 DrRacket 的语言设置为“Pretty Big”

最佳答案

您在第二种情况下遇到的问题是 (define x 42)使x定义它的整个范围的变量。现在,虽然变量是为整个作用域定义的,但它的值直到实际的 (define x 42) 才被定义。线。

(let ()
;; up here, `x` is defined but has an undefined value
;; ...
(define x 42)
;; down here `x` has the value 42
;; ...
)

它的行为更像这样:
(let ([x 'undefined])
;; ... up here, `x` is 'undefined
(set! x 42)
;; ... down here, `x` is 42
)

关于方案范围(定义和让),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946945/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com