public DekiScriptLiteral Visit(DekiScriptVar expr, DekiScriptEnv env)
        {
            if (expr.Name.EqualsInvariant(DekiScriptRuntime.ENV_ID))
            {
                DekiScriptMap vars = new DekiScriptMap();
                vars.AddRange(env.Globals);
                vars.AddRange(env.Locals);
                return(vars);
            }

            // check if variable exists
            DekiScriptLiteral result = env[expr.Name];

            if (result == null)
            {
                throw new DekiScriptUndefinedNameException(expr.Line, expr.Column, expr.Name);
            }
            result = DekiScriptRuntime.EvaluateProperty(result, env);
            return(result);
        }
        public DekiScriptExpression Visit(DekiScriptVar expr, DekiScriptExpressionEvaluationState state)
        {
            if (expr.Name.EqualsInvariant(DekiScriptRuntime.ENV_ID))
            {
                return(expr);
            }

            // check if variable exists
            DekiScriptLiteral result;

            if (!state.Env.Vars.TryGetValue(expr.Name, out result) && !state.Env.Vars.TryGetValue(expr.Name, out result))
            {
                return(expr);
            }

            // check if variable is defined, but the value is unknown
            if (result is DekiScriptUnknown)
            {
                return(expr);
            }
            return(result);
        }
        public DekiScriptOutputBuffer.Range Visit(DekiScriptVar expr, DekiScriptExpressionEvaluationState state)
        {
            if (expr.Name.EqualsInvariant(DekiScriptRuntime.ENV_ID))
            {
                DekiScriptMap vars = new DekiScriptMap();
                vars.AddRange(state.Env.Vars);
                return(state.Push(vars));
            }

            // check if variable exists
            DekiScriptLiteral result;

            if (!state.Env.Vars.TryGetValue(expr.Name, out result))
            {
                result = state.Runtime.ResolveMissingName(expr.Name);
            }

            if (result == null)
            {
                throw new DekiScriptUndefinedNameException(expr.Location, expr.Name);
            }
            result = state.Runtime.EvaluateProperty(expr.Location, result, state.Env);
            return(state.Push(result));
        }