有谁知道是否call/cc
可以仅使用 lambda 和闭包来实现?
似乎call/cc
中断了程序的流程(如异常),但 lambdas 和闭包不能这样做。因此我认为call/cc
不能通过 lambdas 和闭包来实现。
还有什么想法吗?
有谁知道是否call/cc
可以仅使用 lambda 和闭包来实现?
似乎call/cc
中断了程序的流程(如异常),但 lambdas 和闭包不能这样做。因此我认为call/cc
不能通过 lambdas 和闭包来实现。
还有什么想法吗?
这个问题并不是特别清楚,因为“仅用 lambda 和闭包实现”到底是什么意思?
在任何情况下,通过手动编写连续传递样式,可以在任何带有闭包的语言中使用延续。然后可以通过扩展编译器来实现自动翻译成这种形式,Lisps 通常允许通过宏在用户级别上实现。例如参见cl-cont,一个为 Common Lisp 实现延续的库,这是一种没有内置它们的语言。
像 Scheme 中的高效普遍延续很可能在直接处理程序堆栈的较低级别上实现,但这不是必需的,只是优化。
在 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 的问题:是的,可以做到。