//--- Class Methods ---
        public static void Generate(DekiScriptGenerator expr, DekiScriptEval callback, DekiScriptExpressionEvaluationState state)
        {
            // set counter variable
            int counter         = 0;
            var previousCounter = state.Env.Vars[DekiScriptRuntime.COUNT_ID];

            try {
                state.Env.Vars.Add(DekiScriptRuntime.COUNT_ID, DekiScriptExpression.Constant(counter));
                expr.VisitWith(Instance, new DekiScriptGeneratorEvaluationState(innerEnv => {
                    callback(innerEnv);
                    state.Env.Vars.Add(DekiScriptRuntime.COUNT_ID, DekiScriptExpression.Constant(++counter));
                }, state));
            } finally {
                state.Env.Vars.Add(DekiScriptRuntime.COUNT_ID, previousCounter);
            }
        }
 //--- Methods ---
 public void Generate(DekiScriptGenerator expr, DekiScriptEval callback, DekiScriptEnv env)
 {
     expr.VisitWith(this, new DekiScriptGeneratorEvaluationState(callback, env));
 }
 //--- Constructors ---
 public DekiScriptGeneratorEvaluationState(DekiScriptEval callback, DekiScriptEnv env)
 {
     this.Callback = callback;
     this.Env      = env;
 }
 //--- Constructors ---
 public DekiScriptGeneratorEvaluationState(DekiScriptEval callback, DekiScriptExpressionEvaluationState state)
 {
     this.Callback = callback;
     this.State    = state;
 }