延续传递样式的 ANF 转换



将代码从 S 表达式转换为 A 范式的算法在 http://matt.might.net/articles/a-normalization/

作者做出了不寻常的选择,即以延续传递风格编写算法。(也就是说,并不是说中间代码在任何阶段都用 CPS 表示,而是用于进行转换的手写代码是用 CPS 编写的。

就我所看到的它是如何工作的,这是有道理的,延续代表了每个生成的let的主体,但直觉上令人惊讶的是,CPS 应该是人类编写代码的最清晰方式。

这实际上是ANF转换算法最清晰的形式,还是有没有已知的不使用CPS的更好方法?

我看了一下原始论文,(基于粗略阅读(那里的转换被表述为一组简单的重写规则。那里没有什么能立即向我表明需要 CPS。看看Matt Might的博客文章,看起来他对延续的使用或多或少是香草;也就是说,它要么传递给递归调用,要么用"最终结果"调用......除了normalize-name函数,该函数在非尾部位置调用k。所以,从技术上讲,这实际上并不完全是CPS。

无论哪种方式,在我看来,马特只是出于习惯用 CPS 写的。不过,我敢打赌他会很乐意回答你的问题;这可能是一个很好的休息时间,而不是成为一个巨大的医学基金会的负责人。:)

编辑:如果这个答案没有增加你的知识,提前道歉;可能是我所说的一切都你已经知道了。哒!

最新更新