Axiom.Runtime.Builtins.TermEvaluator.Evaluate C# (CSharp) Method

Evaluate() public static method

public static Evaluate ( AbstractTerm t ) : double
t Axiom.Runtime.AbstractTerm
return double
        public static double Evaluate(AbstractTerm t)
        {
            double result = 0;

            AbstractTerm term = t.Dereference();

            if (term.IsConstant)
            {
                int r;
                double d;
                if (Int32.TryParse((string)term.Data(), out r))
                {
                    return r;
                }
                else if (Double.TryParse((string)term.Data(), out d))
                {
                    return d;
                }
                else
                {
                    switch ((string)term.Data())
                    {
                        case "pi":
                            result = Math.PI;
                            break;
                        case "e":
                            result = Math.E;
                            break;
                        case "cputime":
                            Process p = Process.GetCurrentProcess();
                            result = (p.TotalProcessorTime.TotalMilliseconds/1000);
                            break;
                        default:
                            throw new Exception("TermEvaluator: cannot evaluate string " + term.Data());
                    }
                }
            }
            else if (term.IsReference)
            {
                throw new Exception("TermEvaluator: cannot evaluate a reference term.");
            }
            else if (term.IsStructure)
            {
                AbstractTerm op1 = (AbstractTerm)term.Next;
                AbstractTerm op2 = (AbstractTerm)term.Next.Next;

                switch (term.Name)
                {
                    case "+":
                        result = Evaluate(op1) + Evaluate(op2);
                        break;
                    case "-":
                        result = Evaluate(op1) - Evaluate(op2);
                        break;
                    case "*":
                        result = Evaluate(op1) * Evaluate(op2);
                        break;
                    case "/":
                        if (Evaluate(op2) == 0)
                        {
                            throw new Exception("TermEvaluator: Division by zero error.");
                        }
                        result = Evaluate(op1) / Evaluate(op2);
                        break;
                    case "^":
                        result = Math.Pow(Evaluate(op1), Evaluate(op2));
                        break;
                    case "cos":
                        result = Math.Cos(Evaluate(op1));
                        break;
                    case "sin":
                        result = Math.Sin(Evaluate(op1));
                        break;
                    case "tan":
                        result = Math.Tan(Evaluate(op1));
                        break;
                    case "log":
                        result = Math.Log(Evaluate(op1));
                        break;
                }
            }
            return result;
        }
TermEvaluator