【发布时间】:2019-12-17 17:01:34
【问题描述】:
Scheme 编程语言说
事实证明,任何使用 call/cc 的程序都可以在没有 call/cc 的情况下在 CPS 中重写,但是 可能需要彻底重写程序(有时甚至包括系统定义的原语)。
一般的技巧有哪些
将使用
call/cc的程序转换为使用CPS编写的函数的程序反向转换?
【问题讨论】:
-
我首先从这些幻灯片churchturing.org/y/90-min-scc.pdf 中了解了 CPS 转换 - 它将 lambda 演算 + call/cc 中的源代码转换为普通的 lambda 演算。它通过向每个过程添加一个延续参数并使每个过程调用传入一个延续来实现这一点。
-
意图是将any程序转换为CPS。 那么,在转换后的程序中, call/cc 就变得微不足道了。 --
(call/cc (lambda (k) ...))==>(call/cc& (lambda (k) ...) k)==((lambda (k) ...) k)。即(define (call/cc& lam k) (lam k))是定义。这就是简单的故事;我认为最近有一些关于 CPS 中的 call/cc 实现的帖子,在 scheme,尝试搜索它们。 -
其实应该是
(call/cc (lambda (k) ...))==>(call/cc& (lambda (k c) ...) c)==((lambda (k c) ...) c c)。即(define (call/cc& lam c) (lam c c))(在延续始终作为最后一个参数传递的方案下(这当然是任意选择)。
标签: scheme continuations continuation-passing callcc