在Racket指南关于parameterize的部分中,有以下代码:
(define location (make-parameter "here"))
(let ([get (parameterize ([location "with a fox"])
(lambda () (location)))])
(get))
这段代码返回"here"
。
这段代码的求值顺序是什么?谢谢。
在Racket指南关于parameterize的部分中,有以下代码:
(define location (make-parameter "here"))
(let ([get (parameterize ([location "with a fox"])
(lambda () (location)))])
(get))
这段代码返回"here"
。
这段代码的求值顺序是什么?谢谢。
"here"
定义参数location
let
...parameterize
...location
被动态更新为值"with a fox"
lambda
表达式进行求值以创建一个闭包,该闭包封闭了location
parameterized
块返回-参数location
恢复到其原始值"here"
lambda
绑定到get
let
主体...(get)
,它查找当前值为"here"
的location
,这就是结果。"with a fox"
的更新在进入let
主体之前从堆栈中弹出,因此在实际调用get
时不再可见。一个简单的解决方法是复制参数的值并让闭包封闭副本。(define location (make-parameter "here"))
(let ([get (parameterize ([location "with a fox"])
(let ([loc (location)])
(lambda () loc)))])
(get))
lambda
闭合于 loc
,这应该是期望的值。