Ejemplo n.º 1
0
        public static SExpression Cast(SExpr e)
        {
            if (e is SExprAtomic)
            {
                return(Cast(e as SExprAtomic));
            }

            if (e is SExprComp)
            {
                return(Cast(e as SExprComp));
            }

            return(null);
        }
Ejemplo n.º 2
0
        public override SValue Evaluate(ExecEnvironment env)
        {
            if (argument == null)
            {
                return(new SClosure(env, new List <string>()
                {
                    "x"
                }, SExpression.Cast(SExpr.MakeLambda(func, "x"))));
            }

            var     arg = argument.Evaluate(env);
            Decimal n   = 0;

            if (arg is SNumber)
            {
                n = arg.Get <Decimal>();
            }
            else if (arg is SBool)
            {
                n = arg.Get <bool>() ? 1 : 0;
            }

            switch (func)
            {
            case "sin":
                return(new SNumber((Decimal)Math.Sin((double)n)));

            case "cos":
                return(new SNumber((Decimal)Math.Cos((double)n)));

            case "tan":
                return(new SNumber((Decimal)Math.Tan((double)n)));

            case "asin":
                return(new SNumber((Decimal)Math.Asin((double)n)));

            case "acos":
                return(new SNumber((Decimal)Math.Acos((double)n)));

            case "atan":
                return(new SNumber((Decimal)Math.Atan((double)n)));

            case "round":
                return(new SNumber((Decimal)Math.Round((double)n)));

            case "floor":
                return(new SNumber((Decimal)Math.Floor((double)n)));

            case "abs":
                return(new SNumber((Decimal)Math.Abs((double)n)));

            case "sqrt":
                return(new SNumber((Decimal)Math.Sqrt((double)n)));

            case "random":
                if (n != 0)
                {
                    var rand = new Random((int)(n % Int32.MaxValue));
                    return(new SNumber((Decimal)rand.NextDouble()));
                }
                else
                {
                    return(new SNumber((Decimal)SExpression.DefaultRandom.NextDouble()));
                }

            case "time":
                var t = (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)));
                return(new SNumber((Decimal)t.TotalMilliseconds / n));

            case "not":
                return(new SBool(Math.Abs(n - 1) == 1));

            default:
                throw new NotImplementedException();
            }
        }