Note: If you are a casual user of Russell and unfamiliar with Scheme,
you are probably not interested in Callcc.

Callcc may be used to get an explicit value representing the current
computation environment.  A common use is for non-local exits from
procedures.  It can also be used to implement coroutines and the like.
Callcc has signature:

    func[ body: func[cc: func[ val T ] val Void; impure] val T;
          T: type {};
	  impure ] val T

The call

    Callcc[ body, T ]

results in a call to body, with the "current continuation" as an argument.
The current continuation "cc" is a function, whose evaluation consists of the
execution of the remainder of the program, as if callcc had returned the
value passed to cc.  This execution of the remainder of the program is
performed with the environment (identifier bindings) at the time of the
Callcc, but the state (variable values) current at the time "cc" is called.
A (possibly non-local) exit might be implemented as follows:

        Callcc[
	    func[ cc: func[val Short] val Void; impure ] val Short {
                ...
                if
                    ... ==> ...
                    else ==> (* exit *) cc[err_code]
                fi
                ...
            }
        ]

The var Void parameter to Callcc is apparently necessary for type safety.
It is passed on to allow functions with unrestricted side-effects (in
conjunction with -L).

Callcc is a Russell version of the call/cc construct in Scheme.

Warning and Disclaimer:  This construct appears to have found a large number
of adherents in the Scheme community.  It is not clear to the author that it
should be directly accessible to the average programmer.  Explicit
undisciplined use of Callcc can result in extremely unreadable code.  It is
suggested that it be used to implement any other needed control constructs,
and then not be explicitly referenced further.

Implementation note: Callcc was implemented as an afterthought, and involves
copying the run-time stack.  This is faster than you might think, since
anything big is likely to be heap allocated.
