public override void VisitFunction(FunctionExpression functionExpression)
        {
            if (functionExpression.Function == Operators.Plus)
            {
                Visit(functionExpression[0]);
            }
            else if (functionExpression.Function == Operators.Negate)
            {
                SumAggregator aggregator = new SumAggregator();
                aggregator.Visit(functionExpression[0]);
                Append(aggregator, true);
            }
            else if (functionExpression.Function == Operators.Add)
            {
                foreach (Expression argument in functionExpression)
                {
                    Visit(argument);
                }
            }
            else if (functionExpression.Function == Operators.Subtract)
            {
                Visit(functionExpression[0]);
                SumAggregator aggregator = new SumAggregator();
                aggregator.Visit(functionExpression[1]);
                Append(aggregator, true);
            }
            else if (functionExpression.Function == Operators.Multiply || functionExpression.Function == Operators.Divide)
            {
                ProductAggregator aggregator = new ProductAggregator();
                aggregator.Visit(functionExpression);

                Expression expression = aggregator.ToExpression();

                FunctionExpression functionExpression1 = expression as FunctionExpression;
                if (functionExpression1 != null && (functionExpression1.Function == Operators.Multiply || functionExpression1.Function == Operators.Divide))
                {
                    AddExpression(expression);
                }
                else
                {
                    Visit(expression);
                }
            }
            else
            {
                AddExpression(functionExpression);
            }
        }
Example #2
0
        public override void VisitFunction(FunctionExpression functionExpression)
        {
            if (functionExpression.Function == Operators.Plus)
            {
                Visit(functionExpression[0].Simplify());
            }
            else if (functionExpression.Function == Operators.Negate)
            {
                _sign = !_sign;
                Visit(functionExpression[0].Simplify());
            }
            else if (functionExpression.Function == Operators.Multiply)
            {
                foreach (Expression factor in functionExpression)
                {
                    Visit(factor.Simplify());
                }
            }
            else if (functionExpression.Function == Operators.Divide)
            {
                Visit(functionExpression[0].Simplify());
                ProductAggregator aggregator = new ProductAggregator();
                aggregator.Visit(functionExpression[1].Simplify());

                _sign  ^= aggregator._sign;
                _value /= aggregator._value;
                Visit(aggregator._divider);
                foreach (Expression factor in aggregator._factors)
                {
                    _divider *= factor;
                }
            }
            else
            {
                _factors = _factors.Add(functionExpression.Function.
                                        Apply(functionExpression.Select(arg => arg.Simplify())));
            }
        }