如何将表达式转换为cps?

时间:2012-10-04 00:06:12

标签: scheme continuation-passing

我想知道如何将let表达式转换为继续传递样式,如下所示:

(let ([a (lambda (x) (+ 1 x))]) (a 4))

请给我看一些例子。谢谢。

1 个答案:

答案 0 :(得分:3)

首先,请注意let已宏扩展为以下内容:

((lambda (a)
   (a 4))
 (lambda (x)
   (+ 1 x)))

所以,现在,让我们进行CPS转换,我们得到:

((lambda (a k)
   (a 4 k))
 (lambda (x k)
   (+ 1 x k))
 k)

最后一行的k是原始let使用的续篇。

如果所有这些k看起来太混乱,请使用相同的代码:

((lambda (a k1)
   (a 4 k1))
 (lambda (x k2)
   (+ 1 x k2))
 k0)

其中k0是原始续篇。

在这两种情况下,我都认为+也是类似的CPS转换,可以继续将加法结果传递给....