# Continuation Passing Style & Anonymous Methods

March 07, 2007

## Continuation Passing Style & Anonymous Methods

I thought that I would briefly explain the concept of continuation-passing style from my previous post. CPS is a way of simulating continuations in a language that doesn’t support the feature. Basically, we making a function call, one passes to the call an additional argument, which is another function that represents the continuation of the calling function.

Anonymous methods (closures) in C# 2.0 enables CPS with a very convenient syntax. Closures are frames constructed on the heap—allowing us to bypass limitations on function calls imposed by the CLR stack-based implementation.

public void Method()
{
// Code before call
T result = Call(a, b, c)
// Code after call
}

becomes

public void Method()
{
// Code before call
Call(a, b, c,
delegate(T result)
{
// Code after call
});
}

The callee function returns a value by calling the continuation function passed in with the return value.

public void Call(int a, int b, int c, Action<T> func)
{
// ...
if (...)
{
func(result);
return;
}
// ...
}

If a method itself returns a result, then we might return the result of the call like so among many possible ways.

public T Method()
{
// Code before call
return Call(a, b, c,
delegate(T result)
{
T result2;
// Code after call
return result2;
});
}

Unlike a stack-based implementation, the continuation can be called multiple times with different return values or not at all. This technique can be used for backtracking, multithreading, and many other uses. Richter previously used this for a Fire-and-Forget approach to locking. I found this technique useful with dialog boxes to eliminate modality.