[plt-scheme] CPS conversion example, question

From: jerzy.karczmarczuk at info.unicaen.fr (jerzy.karczmarczuk at info.unicaen.fr)
Date: Wed Jan 9 18:55:09 EST 2008

Grant Rettke writes: 

> Today I was reading the Wikipedia article:
> on continuation passing style. It has some example written in Scheme,
> though I'm not sure if they are meant to run or not. In the example of
> converting the "pyth" function from direct style to cps style, for
> example, the direct style runs, but the cps style seems to be written
> backwards. 
> 
> Nonetheless I wanted to try converting a running example from direct
> style to cps style,...
> ;; Direct style
> (define (pyth-ds x y)
>     (sqrt (+ (* x x) (* y y)))) 
> 

;; 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))) 

> Is that the right way to do it?

Don't think so.
The conversion (let ((a b)) (c a)) into ((lambda (a) (c a)) b) has
nothing to do - unless I am wrong - with CPS. Every *inside* operation
should be 'continued'. Think of
let x2 = * x x
    y2 = * y y
    x2p2 = + x2 y2 

in terms of 

* x x \x2 ->
* y y \y2 ->
+ x2 y2 \x2p2 -> ...
(using a bastard Schaskell syntax...; this is finally the form presented
on the page you cite.) 


Jerzy Karczmarczuk 




Posted on the users mailing list.