public override CalcValue GetValue(CLLocalStore vars = null, CLContextProvider context = null)
        {
            vars ??= new CLLocalStore();
            context ??= new CLContextProvider();

            CalcObject obj = GetObject(vars, context);

            vars = new CLLocalStore(Params);

            return(obj.GetValue(vars, context));
        }
 public CalcOperation(CalcObject left, CLOperator oper, CalcObject right)
 {
     Left     = left;
     Operator = oper;
     Right    = right;
 }
        /// <summary>
        /// Returns the object referenced by the name.
        /// </summary>
        /// <param name="vars">A <c>CLLocalStore</c> that stores local
        ///   variables.</param>
        /// <param name="context">The object representing the context in which
        ///   the expression is being evaluated.</param>
        public CalcObject GetObject(CLLocalStore vars = null, CLContextProvider context = null)
        {
            vars ??= new CLLocalStore();
            context ??= new CLContextProvider();

            if (Name.StartsWith("!"))
            {
                if (CLCodeFunction.Exists(Name.Substring(1)))
                {
                    return(new CalcCodeFunction(Name.Substring(1), Params));
                }
            }

            if (Name.StartsWith("_") || Name.StartsWith("^"))
            {
                if (!(vars.ContainsVar(Name)))
                {
                    throw new CLException("No variable named " + Name + " exists.");
                }
                else
                {
                    return(vars[Name]);
                }
            }

            int count = 0;

            if (Int32.TryParse(Name, out count))
            {
                if (count == 0)
                {
                    return(new CalcString(Name));
                }
                if (vars.ParamCount >= count)
                {
                    return(vars[count - 1]);
                }
                else if (Params.Length > 0)
                {
                    return(Params[0]);
                }
                else
                {
                    throw new CLException("No parameter #" + count + " exists.");
                }
            }

            if (Name == "...")
            {
                return(new CalcListExpression(vars.CopyParams()));
            }

            CalcObject ret = CLVariables.Load(Name, context);

            if (ret != null)
            {
                return(ret);
            }

            throw new CLException("No variable named " + Name + " exists.");
        }