public DekiScriptOutputBuffer.Range Visit(DekiScriptTryCatchFinally expr, DekiScriptExpressionEvaluationState state)
        {
            int marker = state.Buffer.Marker;

            try {
                expr.Try.VisitWith(this, state);
            } catch (DekiScriptFatalException) {
                throw;
            } catch (DekiScriptControlFlowException) {
                throw;
            } catch (Exception e) {
                state.Buffer.Reset(marker);

                // translate exception to an error object
                DekiScriptMap error = DekiScriptLibrary.MakeErrorObject(e, state.Env);

                // capture error object in a nested environment
                try {
                    state.Env.Vars.Add(expr.Variable, error);
                    expr.Catch.VisitWith(this, state);
                } finally {
                    state.Env.Vars.Add(expr.Variable, DekiScriptNil.Value);
                }
            } finally {
                expr.Finally.VisitWith(this, state);
            }
            return(state.Buffer.Since(marker));
        }
 public DekiScriptExpression Visit(DekiScriptTryCatchFinally expr, DekiScriptExpressionEvaluationState state)
 {
     // TODO (steveb)
     return(expr);
 }