方案:当与Continutation一起使用时,define和let之间有什么区别

Shi*_* Wu 4 scheme continuations racket

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

(define cont2 #f) 
(call/cc (lambda (k) (set! cont2 k)))
(display "*")
(cont2 #f)
Run Code Online (Sandbox Code Playgroud)

(let [(cont #f)]
  (call/cc (lambda (k) (set! cont k)))
  (display "*")
  (cont #f))
Run Code Online (Sandbox Code Playgroud)

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

所以我很困惑.是否有一些特殊的事情define 或延续不是我想的 - 所有以下程序,直到程序结束,它似乎有一个边界或东西.

另一个猜测是顶级环境是特殊处理的,如下所示:

(define (test)
  (define cont2 #f) 
  (call/cc (lambda (k) (set! cont2 k)))
  (display "*")
  (cont2 #f))
(test)
Run Code Online (Sandbox Code Playgroud)

这有效,但为什么呢?

谢谢您的帮助!

stc*_*ang 8

在Racket中,每个顶级表达式都包含一个提示符.

由于call/cc仅"捕获当前延续到最近的提示",在第一个示例中,没有捕获任何其他顶级表达式,因此仅适用cont2#f结果#f.

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