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); } }
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()))); } }