14

有谁知道是否call/cc可以仅使用 lambda 和闭包来实现?

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

还有什么想法吗?

4

2 回答 2

12

这个问题并不是特别清楚,因为“仅用 lambda 和闭包实现”到底是什么意思?

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

像 Scheme 中的高效普遍延续很可能在直接处理程序堆栈的较低级别上实现,但这不是必需的,只是优化。

于 2010-09-28T11:24:56.200 回答
11

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

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

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

因此,回答您对 Scheme 的问题:是的,可以做到。

于 2010-10-04T10:44:27.800 回答