# [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 Previous message: [plt-scheme] Re: CPS conversion example, question Next message: [plt-scheme] Slime-like documentation Messages sorted by: [date] [thread] [subject] [author]

```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. Previous message: [plt-scheme] Re: CPS conversion example, question Next message: [plt-scheme] Slime-like documentation Messages sorted by: [date] [thread] [subject] [author]