9

在 Scheme 和CPS转换的上下文中,我在确定管理redexes (lambdas) 到底是什么时遇到了一些麻烦:

  • CPS 转换引入的所有lambda 表达式
  • 只有CPS 转换引入的 lambda 表达式,但如果您“手动”或通过更智能的 CPS 转换器进行转换,您就不会编写

如果可能,欢迎提供良好的参考。

4

2 回答 2

5

Redex 代表“可简化表达式”,它是一个不是值的表达式。因此,lambda 不是 redex,而是 call。
在 CPS 中,管理 redex 是其运算符是连续 lambda 的 redex。这样的 redexes 可以立即减少,因为您知道您正在调用哪个函数。
例如,((lambda (u) ...) foo)是一个管理 redex,但(k foo)不是。

于 2010-06-09T06:19:18.667 回答
4

我想我找到了答案。(编辑:我已经接受了dimvar的答案,它更短更正确。)

假设输入程序不是完全的 CPS,至少有一个程序返回点必须通过 CPS 转换转换为一个延续。所以这种延续既是由转换引入的,也是必要的。因为这是必要的,所以您总是需要这样做,例如在手动转换时也是如此。因此,管理 redexes 只是 CPS 转换引入的那些不是真正必要的 lambdas(我的第二个定义)。

我找到了一篇这样解释它的论文(强调我的):

然而,在 CPS 中的朴素 λ 编码产生了相当令人印象深刻的 lambda膨胀,其中大部分形成了可以安全地减少的行政重译。行政裁减产生的 CPS 术语与可以手写的内容相对应。因此,在 CPS 转换时消除尽可能多的行政重排已成为一项挑战。

当然,欢迎任何评论或建议。

于 2010-01-23T11:18:36.720 回答