>>12It is not that horrible if you look at the denotational semantics. And theoretically you can define shift/reset in terms of call/cc, but this is error prone.
Racket nicely documented it:
(reset val) => val
(reset E[(shift k expr)]) => (reset ((lambda (k) expr)
(lambda (v) (reset E[v]))))
The second rule is important.
E is the computation you captured. It is the part between reset and shift. Then with shift k expr, you are going to reify your captured computation E into a function k, which you then can call as often as you want, put it into a variable or whatever.
As you can see, a new barrier (reset) is instantiated with shift/reset. (the part lambda (v) (reset E[v])), but with control/prompt this isn't done.