理解CPS

**CPS就是 continuation-passing style **

;普通形式
(define (pyth x y) (sqrt (+ (* x x) (* y y))))

;CPS形式
(define (pyth&  x y k) 
    (*& x x (lambda (x2) 
        (*& y y (lambda (y2)
            (+& x2 y2 (lambda (x2py2) 
                (sqrt& x2py2 k))))))))

看到没有CPS形式都有一个回调函数,也叫 its continuation .所以pyth函数在最后一步执行了回调函数k,参数来源于前面几部的结果 所以CPS又叫尾递归

那好处是什么呢 ,我的理解就是在执行最后一步回调函数k之前,堆栈中的所有空间都可以清空,留给函数k。
这样我们把如果能把复杂问题用尾递归的形式来表达,意味着整个程序的控制流都被你这个函数显式的描述了。

再来思想跳跃一下,这个的终极应用是什么呢,如果我们的编译器可以将我们的程序通过某种变换全部转为CPS形式,这样复杂的递归问题就会变为,最后一步简单优化为Goto 的问题,明白了没有,但编译原理还不止这些,但CPS变换绝对是这里面很关键的概念。

你可能感兴趣的:(理解CPS)