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

bod*_*ydo 14 lisp scheme continuations computer-science callcc

有谁知道是否call/cc可以用lambdas和闭包实现?

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

还有什么想法吗?

Ram*_*ren 12

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

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

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

  • 通常是正确的,但您原则上可以通过将continuation和arguments向上返回到某个"CPS-driver"循环来手动擦除堆栈帧. (4认同)
  • CPS可以工作,但问题是它只能*用于你控制的代码(并且可以用CPS).例如,处理库变得困难,因为您需要将它们视为外来调用,即使它们是您的语言.(顺便说一句,那些"SPC驱动程序循环"通常被称为tampolining.) (3认同)

elj*_*nso 11

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

(lambda (f k) (f (lambda (v k0) (k v)) k))
Run Code Online (Sandbox Code Playgroud)

其中k是要保存的延续,并且(lambda (v k0) (k v))是恢复此延续的转义过程(无论k0何时被调用,它都处于活动状态,将被丢弃).

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