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)