我想知道以下两个代码之间的区别:
(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)
这行得通,但为什么呢?
谢谢您的帮助!