Пример #1
0
        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);
        }
Пример #2
0
        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()}'");
            }
        }
Пример #3
0
        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));
        }
Пример #4
0
 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)}") )})");
 }
Пример #5
0
 public string VisitCallExpr(Expr.Call expr)
 {
     return(Parenthesize((expr.Callee as Expr.Literal)?.Value.ToString(), expr.Arguments.ToArray()));
 }