[plt-scheme] Re: CPS conversion example, question
On Jan 9, 2008, at 3:35 PM, Grant Rettke wrote:
> On Jan 9, 2008 3:46 PM, Grant Rettke <grettke at acm.org> wrote:
>> Is that the right way to do it?
>
> I actually skipped a transformation in the end, so this is what it
> should have been:
>
> ;; Let style
> (define (pyth-ls x y k)
> (let ([x2 (* x x)])
> (let ([y2 (* y y)])
> (let ([x2py2 (+ x2 y2)])
> (let ([result (sqrt x2py2)])
> (k result))))))
>
> ; CPS Style
> (define (pyth-cps x y k)
> ((λ (x2)
> ((λ (y2)
> ((λ (x2py2)
> ((λ (result)
> (k result)) (sqrt x2py2))) (+ x2 y2))) (* y y))) (* x
> x))
Terse answer: no, or at least not any more CPSed than your original.
If you're imagining +,*, and sqrt as atomic, then this is in CPS form:
(define (pyth-cps x y k) (k (sqrt (+ (* y y) (* x x)))))
If, however, you're imagining that +,*, and sqrt are not atomic and
need to be called with continuations, then the result is going to look
something like this:
(define (pyth-cps x y k)
(* x x
(lambda (x2)
(* y y
(lambda (y2)
(+ x2 y2
(lambda (x2py2)
(sqrt x2py2
(lambda (result)
(k result))))))))))
(note that I haven't tried running this).
The point is that all of the cps-ed procedures can occur only in tail
position.
John