在 Scheme 和CPS转换的上下文中,我在确定管理redexes (lambdas) 到底是什么时遇到了一些麻烦:
- CPS 转换引入的所有lambda 表达式
- 只有CPS 转换引入的 lambda 表达式,但如果您“手动”或通过更智能的 CPS 转换器进行转换,您就不会编写
如果可能,欢迎提供良好的参考。
Redex 代表“可简化表达式”,它是一个不是值的表达式。因此,lambda 不是 redex,而是 call。
在 CPS 中,管理 redex 是其运算符是连续 lambda 的 redex。这样的 redexes 可以立即减少,因为您知道您正在调用哪个函数。
例如,((lambda (u) ...) foo)
是一个管理 redex,但(k foo)
不是。
我想我找到了答案。(编辑:我已经接受了dimvar的答案,它更短更正确。)
假设输入程序不是完全的 CPS,至少有一个程序返回点必须通过 CPS 转换转换为一个延续。所以这种延续既是由转换引入的,也是必要的。因为这是必要的,所以您总是需要这样做,例如在手动转换时也是如此。因此,管理 redexes 只是 CPS 转换引入的那些不是真正必要的 lambdas(我的第二个定义)。
我找到了一篇这样解释它的论文(强调我的):
然而,在 CPS 中的朴素 λ 编码产生了相当令人印象深刻的 lambda膨胀,其中大部分形成了可以安全地减少的行政重译。行政裁减产生的 CPS 术语与可以手写的内容相对应。因此,在 CPS 转换时消除尽可能多的行政重排已成为一项挑战。
当然,欢迎任何评论或建议。