gpt4 book ai didi

lisp - Racket中 `parameterize'和 `let'的求值顺序是怎样的?

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:37 26 4
gpt4 key购买 nike

在 Racket 指南中关于 parameterize ,有如下一段代码:

(define location (make-parameter "here"))

(let ([get (parameterize ([location "with a fox"])
(lambda () (location)))])
(get))

代码返回“here”

评估这段代码的顺序是什么?谢谢。

最佳答案

这是许多语言(不仅仅是 Racket)中动态范围值的常见问题。以下是评估代码时发生的情况:

  1. location 参数定义为值 "here"
  2. 输入...
  3. 输入parameterize...
  4. 参数 location 动态更新为值 "with a fox"
  5. 评估 lambda 表达式以创建一个关闭 location
  6. 的闭包
  7. parameterized block 返回——参数location恢复到它的原始值“here”
  8. 生成的 lambda 绑定(bind)到 get
  9. 评估 body ...
  10. 你调用(get),它会查找location的当前值,也就是"here",这就是结果.

如果您仔细阅读有关参数的文档,它会解释该参数始终采用堆栈中最近更新的值。由于您的值 "with a fox" 的更新在进入 let 主体之前从堆栈中弹出,因此当您实际调用 时它不再可见>得到。一个简单的解决方法是从参数中复制值并让闭包关闭副本:

(define location (make-parameter "here"))

(let ([get (parameterize ([location "with a fox"])
(let ([loc (location)])
(lambda () loc)))])
(get))

现在 lambdaloc 上关闭,它应该具有预期的值。

关于lisp - Racket中 `parameterize'和 `let'的求值顺序是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17905853/

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