【问题标题】:How can we convert between a program using `call/cc` and a program using functions written in CPS?我们如何在使用 `call/cc` 的程序和使用 CPS 编写的函数的程序之间进行转换?
【发布时间】: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


【解决方案1】:

您可以在此处http://matt.might.net/articles/cps-conversion/ 或从 Appel 的 Compiling With Continuations 一书中了解如何实现延续传递转换。

逆变换比较困难,实际应用较少,但有一篇论文:Back to Direct Style (1994) by Olivier Danvy

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 2018-01-27
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多