连续传递样式的 ANF 转换
ANF conversion in continuation passing style
http://matt.might.net/articles/a-normalization/
给出了将代码从 S 表达式转换为 A 范式的算法
作者做出了不寻常的选择,以连续传递方式编写算法。 (也就是说,不是中间代码在任何阶段都用CPS表示,而是手写的做转换的代码,是用CPS写的。)
在我看来它是如何工作的,它是有道理的,continuation 代表每个生成的主体 let
,但直觉上令人惊讶的是,CPS 应该是人类编写代码的最清晰的方式。
这实际上是最清晰的 ANF 转换算法形式,还是有已知的不使用 CPS 的更好方法?
我看了一下原论文,(基于粗略的阅读)那里的转换被表述为一组简单的重写规则。没有什么可以立即向我暗示需要 CPS。查看 Matt Might 的博客 post,看起来他对延续的使用或多或少是普通的;也就是说,它要么传递给递归调用,要么用 "final result"... 调用,但 normalize-name
函数除外,它在非尾部位置调用 k
。所以,从技术上讲,这实际上 不是 完全 CPS。
无论哪种方式,在我看来 Matt 只是出于习惯用 CPS 编写它。不过,我敢打赌他会很乐意回答你的问题;从成为一个庞大的医学基金会的负责人开始,这可能是一个很好的突破。 :)
编辑:如果这个答案没有增加您的知识,请提前致歉;可能我所说的一切你都已经知道了。塔!
http://matt.might.net/articles/a-normalization/
给出了将代码从 S 表达式转换为 A 范式的算法作者做出了不寻常的选择,以连续传递方式编写算法。 (也就是说,不是中间代码在任何阶段都用CPS表示,而是手写的做转换的代码,是用CPS写的。)
在我看来它是如何工作的,它是有道理的,continuation 代表每个生成的主体 let
,但直觉上令人惊讶的是,CPS 应该是人类编写代码的最清晰的方式。
这实际上是最清晰的 ANF 转换算法形式,还是有已知的不使用 CPS 的更好方法?
我看了一下原论文,(基于粗略的阅读)那里的转换被表述为一组简单的重写规则。没有什么可以立即向我暗示需要 CPS。查看 Matt Might 的博客 post,看起来他对延续的使用或多或少是普通的;也就是说,它要么传递给递归调用,要么用 "final result"... 调用,但 normalize-name
函数除外,它在非尾部位置调用 k
。所以,从技术上讲,这实际上 不是 完全 CPS。
无论哪种方式,在我看来 Matt 只是出于习惯用 CPS 编写它。不过,我敢打赌他会很乐意回答你的问题;从成为一个庞大的医学基金会的负责人开始,这可能是一个很好的突破。 :)
编辑:如果这个答案没有增加您的知识,请提前致歉;可能我所说的一切你都已经知道了。塔!