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