private double Max(Expr.Call expr) { if (expr.Arguments.Count == 0) { throw new InterpreterError($"max takes at least one argument, got 0."); } if (expr.Arguments.Count == 1) { var res = Evaluate(expr.Arguments.First()); CheckNumberOperand(expr.Function, res); return((double)res); } var firstMax = Evaluate(expr.Arguments[0]); CheckNumberOperand(expr.Function, firstMax); var secondMax = Evaluate(expr.Arguments[1]); CheckNumberOperand(expr.Function, secondMax); var currentMax = Math.Max((double)firstMax, (double)secondMax); for (var i = 2; i < expr.Arguments.Count; ++i) { var next = Evaluate(expr.Arguments[i]); CheckNumberOperand(expr.Function, next); currentMax = Math.Max(currentMax, (double)next); } return(currentMax); }
public object VisitCallExpr(Expr.Call expr) { var name = (expr.Callee as Expr.Literal)?.Value.ToString(); if (name == null) { throw new InterpreterError("Function call without a name?!"); } switch (name.ToLowerInvariant()) { case "floor": return(Floor(expr)); case "ceil": case "ceiling": return(Ceil(expr)); case "round": return(Round(expr)); case "min": return(Min(expr)); case "max": return(Max(expr)); default: throw new InterpreterError($"Unknown function '{name.ToLowerInvariant()}'"); } }
private double Round(Expr.Call expr) { if (expr.Arguments.Count == 0 || expr.Arguments.Count > 1) { throw new InterpreterError($"round takes exactly one argument, got {expr.Arguments.Count}."); } var res = Evaluate(expr.Arguments.First()); CheckNumberOperand(expr.Function, res); return(Math.Round((double)res)); }
public string VisitCallExpr(Expr.Call expr) { return($"{expr.Callee.Accept(this)}({expr.Arguments.Aggregate("", (s, expr1) => s + (string.IsNullOrEmpty(s) ? expr1.Accept(this) : $", {expr1.Accept(this)}") )})"); }
public string VisitCallExpr(Expr.Call expr) { return(Parenthesize((expr.Callee as Expr.Literal)?.Value.ToString(), expr.Arguments.ToArray())); }