His hypothetical continuations don't quite work.<p><pre><code> theSite = mark();
puts "Hello, World!"
theSite.return();
</code></pre>
This is the first example in the post, and one which it's claimed will loop continually. Translating to Scheme (where we can actually run the pseudo-code):<p><pre><code> (begin
(define theSite #f)
(set! theSite (call/cc (lambda (c) c)))
(print "Hello, World!") (newline)
(theSite #f))
</code></pre>
And we get:<p><pre><code> > (begin
(define theSite #f)
(set! theSite (call/cc (lambda (c) c)))
(print "Hello, World!") (newline)
(theSite #f))
"Hello, World!"
"Hello, World!"
procedure application: expected procedure, given: #f; arguments were: #f
</code></pre>
This translation to Scheme seems fair, since the definition of mark() explicitly states that it "allows you to pass information back to the original site, so that it evaluates to a different value" -- which means that the return value of mark() itself is clearly significant, and therefore that the step of "set theSite to the result of evaluating the current form" is considered part of the continuation (or "mark").<p>In this case, theSite gets set to #f, and the continuation is then "broken".<p>It might seem tedious to nitpick here, but continuations are so mysterious exactly because of these issues. mark() _can't be fixed_ without drastically changing the semantics of continuations. This is kinda non-obvious, and something that people often discover suddenly when wondering why call/cc is implemented in such a roundabout fashion.<p>Continuations are confusing to point where even toy examples in pedagogical blog posts are easy to mess up.