private object _ceil(INakoFuncCallInfo info) { object a = info.StackPop(); object b = info.StackPop(); int ib = 0; if (b is string) { string sb = (string)b; if (sb.Contains(".")) { ib = GetDigitOfDecimal(sb); } else { ib = int.Parse(sb); } } else { ib = NakoValueConveter.ToInt(b); } double da = NakoValueConveter.ToDouble(a); return(__ceil(da, ib)); }
public void TestInterpreter1() { NakoCompiler ns = new NakoCompiler(); NakoInterpreter runner = new NakoInterpreter(); object o; // 1 ns.source = "1+2*3"; ns.Tokenize(); ns.ParseOnlyValue(); runner.Run(ns.WriteIL()); o = runner.StackTop; Assert.IsNotNull(o); Assert.IsTrue(7 == NakoValueConveter.ToLong(o)); // 2 ns.source = "(1+2)*3"; ns.Tokenize(); ns.ParseOnlyValue(); runner.Run(ns.WriteIL()); o = runner.StackTop; Assert.IsNotNull(o); Assert.IsTrue(9 == NakoValueConveter.ToLong(o)); // 3 ns.source = "1+4/2"; ns.Tokenize(); ns.ParseOnlyValue(); runner.Run(ns.WriteIL()); o = runner.StackTop; Assert.IsNotNull(o); Assert.IsTrue(3 == NakoValueConveter.ToLong(o)); }
private void _branch_false(NakoILCode code) { object v = calcStack.Pop(); if (NakoValueConveter.ToLong(v) == 0) { autoIncPos = false; runpos = Convert.ToInt32((long)code.value); } }
private object calc_method_xor(object a, object b) { if (a is long && b is long) { return((long)a ^ (long)b); } if (a is double || b is double) { return(NakoValueConveter.ToLong(a) ^ NakoValueConveter.ToLong(b)); } throw new NakoInterpreterException("オブジェクトは論理演算できません"); }
private object calc_method_gteq(object a, object b) { if (a is long && b is long) { return((long)a >= (long)b); } if (a is string || b is string) { return(string.Compare(NakoValueConveter.ToString(a), NakoValueConveter.ToString(b)) >= 0); } if (a is double || b is double) { return(NakoValueConveter.ToDouble(a) >= NakoValueConveter.ToDouble(b)); } throw new NakoInterpreterException("オブジェクトは比較できません"); }
private object calc_method_not_eq(object a, object b) { if (a is long && b is long) { return((long)a != (long)b); } if (a is string || b is string) { return(NakoValueConveter.ToString(a) != NakoValueConveter.ToString(b)); } if (a is double || b is double) { return(NakoValueConveter.ToDouble(a) != NakoValueConveter.ToDouble(b)); } return(a != b); }
private object _mod(INakoFuncCallInfo info) { object a = info.StackPop(); object b = info.StackPop(); if (a is long && b is long) { return((long)a % (long)b); } else { double da = NakoValueConveter.ToDouble(a); double db = NakoValueConveter.ToDouble(b); return(da % db); } }
private double ToDouble(object v) { return(NakoValueConveter.ToDouble(v)); }