gpt4 book ai didi

Scheme:define 和 let 与 continuation 一起使用时有什么区别

转载 作者:行者123 更新时间:2023-12-04 22:05:30 35 4
gpt4 key购买 nike

我想知道以下两个代码之间的区别:

(define cont2 #f) 
(call/cc (lambda (k) (set! cont2 k)))
(display "*")
(cont2 #f)


(let [(cont #f)]
(call/cc (lambda (k) (set! cont k)))
(display "*")
(cont #f))

在我看来,这两个程序的正确行为应该是无限打印“*”。
但是,第一个只打印一个 '*' 并退出,
而第二个给出了正确的行为。

所以我很困惑。 define 有什么特别的吗
或者延续不是我想的那样——后面的所有节目一直到节目结束,好像都有边界什么的。

另一种猜测是顶级环境被特殊处理,像这样:
(define (test)
(define cont2 #f)
(call/cc (lambda (k) (set! cont2 k)))
(display "*")
(cont2 #f))
(test)

这有效,但为什么呢?

感谢您的帮助!

最佳答案

在 Racket 中,每个顶级表达式都用 prompt 包裹。

由于 call/cc 仅“捕获当前延续到最近的提示”,因此在您的第一个示例中,没有捕获任何其他顶级表达式,因此将 cont2 应用于 #f 只会产生 #f

此外,将第一个示例包装在 begin 中不会改变事情,因为顶级 begin 隐式拼接其内容,就好像它们是顶级表达式一样。

关于Scheme:define 和 let 与 continuation 一起使用时有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094657/

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