Scheme 以下表达式中的当前延续是哪个?

Scheme 以下表达式中的当前延续是哪个?,scheme,continuations,Scheme,Continuations,在表达式(call/cc(lambda(k)(k12))中,有三个连续体:(k12),(lambda(k)(k12)),和(call/cc(lambda(k)(k12))。哪一个是“当前延续” 在一些书中,continuations被看作是一个等待值的过程,当它应用到一个值时,它会立即返回。是这样吗 有人能详细解释一下当前的continuation是什么吗?本例中的continuation是接收调用/cc调用返回值的“thing”。因此: (display (call/cc (lambda (k

在表达式
(call/cc(lambda(k)(k12))
中,有三个连续体:
(k12)
(lambda(k)(k12))
,和
(call/cc(lambda(k)(k12))
。哪一个是“当前延续”

在一些书中,continuations被看作是一个等待值的过程,当它应用到一个值时,它会立即返回。是这样吗


有人能详细解释一下当前的continuation是什么吗?

本例中的continuation是接收
调用/cc
调用返回值的“thing”。因此:

(display (call/cc (lambda (k) (k 12)))
结果与

(display 12)
Scheme中的延续“外观和感觉”类似于过程,但实际上它们的行为与过程不同。CPS转换可以帮助您更好地理解连续性


在CPS转换中,函数不是返回值,而是接受一个continuation参数,并用结果调用continuation。因此,经过CPS转换的
sqrt
函数将使用
(sqrt 64 k)
调用,而不是返回8,它只是在尾部位置调用
(k 8)

因为continuations(在CPS转换函数中)是尾部调用的,所以函数不必担心continuations返回,事实上,在大多数情况下,它们不需要返回

考虑到这一点,下面是一个简单的函数示例:

(define (hypot x y)
  (sqrt (+ (* x x) (* y y))))
及其CPS转换版本:

(define (hypot x y k)
  (* x x (lambda (x2)
           (* y y (lambda (y2)
                    (+ x2 y2 (lambda (sum)
                               (sqrt sum k))))))))
(假设
*
+
sqrt
也都已转换为CPS,以接受连续参数)


现在,有趣的部分是:CPS转换的
call/cc
具有以下定义:

(define (call/cc fn k)
  (fn k k))
通过CPS转换,
call/cc
易于理解和实现。如果没有CPS转换,
call/cc
可能需要一个非常神奇的实现(例如,通过堆栈复制等)。

(k12)
这样的东西不是延续。在一些较大的程序中,每个子表达式都有一个延续。因此,例如,
(*3(+x42))
中的
x
的延续是
(lambda(u)(*3(+u42))

在您的示例中,
(call/cc(lambda(k)(k12))
的“当前延续”将是该表达式周围的任何内容。如果您只是在scheme提示符中键入它,那么它周围没有任何内容,因此“当前继续”只是
(lambda())
。如果您键入类似于
(*3(+(call/cc(lambda(k)(k12)))42))
,则继续符是
(lambda())(*3(+)42))

请注意,我用来表示“当前延续”的lambda与传入的
call/cc
不同(在您的示例中命名为
k
k
具有一种特殊的控制效果,即在计算当前连续性之后中止其余的计算