只能用lambdas和闭包来实现call-with-current-continuation?

时间:2010-09-28 09:37:06

标签: lisp computer-science scheme continuations callcc

有没有人知道call/cc是否只能用lambdas和闭包实现?

似乎call/cc中断了程序的流程(就像异常一样),但是lambdas和closures不能这样做。因此我认为call/cc无法通过lambdas和闭包来实现。

还有什么想法?

2 个答案:

答案 0 :(得分:12)

这个问题并不是特别清楚,因为“只用lambdas和闭包实现”究竟是什么意思?

在任何情况下,通过在continuation passing style中手动编写,可以在任何闭包语言中使用continuation。然后可以通过扩展编译器来实现自动转换为此表单,Lisps通常允许在用户级别通过宏。例如,请参阅cl-cont,这是一个实现Common Lisp的延续的库,这是一种没有内置它们的语言。

如Scheme中的高效普遍延续可能会在直接处理程序堆栈的较低级别上实现,但这不是一个要求,只是一个优化。

答案 1 :(得分:11)

在Scheme中,您可以在转换为延续传递样式(CPS)时使用lambdas实现call/cc。转换为CPS时,call/cc的每次出现都可以替换为以下等价物:

(lambda (f k) (f (lambda (v k0) (k v)) k))

其中k是要保存的继续,(lambda (v k0) (k v))是恢复此延续的转义过程(在调用它时处于活动状态的任何延续k0将被丢弃)。

所以,回答你对Scheme的问题:是的,可以做到。