小编use*_*086的帖子

方案范围(定义和让)

所以我知道在Scheme中定义的是动态作用域,并且允许静态作用域,但是下面的内容让我困惑:

如果我有

(let ((x 0))
  (define f (lambda () x))
  (display (f))
  (let ((x 1))
    (display (f))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它将显示00.到目前为止一切顺利.但是,如果我为x添加额外的定义,如下所示:

(let ((x 0))
  (define f (lambda () x))
  (display (f))
  (define x 4)
  (let ((x 1))
    (display (f))
    )
  )
Run Code Online (Sandbox Code Playgroud)

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

还值得一提的是,用letrec而不是define绑定f也会起作用:

(let ((x 0))
  (letrec ((f (lambda () x)))
  (display (f))
  (define x 4)
  (let ((x 1))
    (display (f))
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

返回00.

注意:我使用了DrRacket,上面写着"Pretty Big"

scheme scoping racket

5
推荐指数
2
解决办法
932
查看次数

标签 统计

racket ×1

scheme ×1

scoping ×1