public override double EvaluateVarFunction(VarFuncToken token) { Func <double, double> func; int start; switch (token.Symbol) { case ParserSymbols.Sum: func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3], token.VariableSymbol, parser, Context.Options); start = (int)eval(token.SubTokens[1]); return(Enumerable.Range(start, (int)eval(token.SubTokens[2]) - start + 1) .Select(v => func(v)).Sum()); case ParserSymbols.Prod: func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3], token.VariableSymbol, parser, Context.Options); start = (int)eval(token.SubTokens[1]); return(Enumerable.Range(start, (int)eval(token.SubTokens[2]) - start + 1) .Select(v => func(v)) .Aggregate((v1, v2) => v1 * v2)); default: if (Context.Options.StrictMode) { throw new UnsupportedOperationException(token.Symbol); } return(double.NaN); } }
public override BigDecimal EvaluateVarFunction(VarFuncToken token) { if (Context.Options.StrictMode) { throw new UnsupportedOperationException(token.Symbol); } double result = token.Evaluate(fallback); if (double.IsNaN(result)) { throw new ParserArithmeticException(token.Position); } else { return(result); } }
public override string EvaluateVarFunction(VarFuncToken token) { string symbol = String.Empty; switch (token.Symbol) { case ParserSymbols.Sum: symbol = "∑"; break; case ParserSymbols.Prod: symbol = "∏"; break; } var sb = new StringBuilder($"<munderover><mo>{symbol}</mo>"); sb.AppendFormat("<mrow><mi>{0}</mi><mo>=</mo>{1}</mrow>", token.VariableSymbol, evalSub(token, 1)); sb.AppendFormat("<mrow>{0}</mrow></munderover>", evalSub(token, 2)); sb.AppendFormat("<mrow>{0}</mrow>", evalSub(token, 3)); return(sb.ToString()); }
public override Expression EvaluateVarFunction(VarFuncToken token) { Func <double, double> func; switch (token.Symbol) { case ParserSymbols.Sum: func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3], token.VariableSymbol, parser, Context.Options); return(iterateExpr(0, token.SubTokens[1], token.SubTokens[2], (v, i) => v + func(i))); case ParserSymbols.Prod: func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3], token.VariableSymbol, parser, Context.Options); return(iterateExpr(1, token.SubTokens[1], token.SubTokens[2], (v, i) => v * func(i))); default: if (Context.Options.StrictMode) { throw new UnsupportedOperationException(token.Symbol); } return(Expression.Constant(double.NaN)); } }
/// <summary> /// Evaluates a given iteration function token. /// </summary> /// <param name="token">The token to be evaluated.</param> /// <returns>The evaluated value.</returns> public abstract T EvaluateVarFunction(VarFuncToken token);
public override string EvaluateVarFunction(VarFuncToken token) => EvaluateFunction(token);