Scheme 环境不是延续的一部分?

Scheme 环境不是延续的一部分?,scheme,continuations,Scheme,Continuations,环境是否不是计划延续的一部分 我用鸡肉、粗俗、球拍和花招测试过这一点,它们的行为都很相似: (define kont #f) (let ((a 1) (b 2)) (call-with-current-continuation (lambda (k) (set! kont k) (display 'mutating) (newline) (set! a -1) (set! b -2))) (display (+ a b

环境是否不是计划延续的一部分

我用鸡肉、粗俗、球拍和花招测试过这一点,它们的行为都很相似:

(define kont #f)

(let ((a 1)
      (b 2))
  (call-with-current-continuation
   (lambda (k)
     (set! kont k)
     (display 'mutating)
     (newline)
     (set! a -1)
     (set! b -2)))
  (display (+ a b))
  (newline))
在计算LET时,我希望是-3,但在调用kont时是+3(因为我认为程序会记住变异前a和b的绑定):

(let…)-3.
(通达100)
=> -3
(通达100)
=> -3

那么延续只影响控制,而不影响环境?在这种情况下,为什么说实现continuations的方法之一是“复制堆栈”(绑定是否不在堆栈上?

使用set!在环境中更改a和b的值!。所以a和b在延拓环境中是-1和-2。您无法展开副作用。a、b和kont在续集中没有区别。

续集捕获绑定。然而,正如您所猜测的,这些绑定是可变的

在这里,你被“复制堆栈”的口号误导了。虽然这是一种合理的方式来考虑call/cc,但它并不是全部。首先,您真的不希望有一种语言特性公开本地绑定是否是堆栈分配的

相反,call/cc是使用“程序上下文”的概念定义的。为了更好地处理这个问题,您可能想看看Shriram Krishnamurthi的(免费的,在线的)教科书,或者(不是免费的,更深入的)书“语义工程与PLT Redex”

作为旁白;您的程序没有真正检查您希望它检查的内容,因为您从未调用捕获的延续。我想你想写这样的东西:

#lang racket

(define kont #f)

(let ([a 3])

  (let/cc k
    (set! kont k)
    (set! a 4))
  (printf "~s\n" a))

(kont)

。。。它显示了与您上面提到的几乎相同的行为。

或者是continuation携带了环境和绑定,但是它们是可变的?
#lang racket

(define kont #f)

(let ([a 3])

  (let/cc k
    (set! kont k)
    (set! a 4))
  (printf "~s\n" a))

(kont)