有没有人知道call/cc
是否只能用lambdas和闭包实现?
似乎call/cc
中断了程序的流程(就像异常一样),但是lambdas和closures不能这样做。因此我认为call/cc
无法通过lambdas和闭包来实现。
还有什么想法?
答案 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的问题:是的,可以做到。