예제 #1
0
 public static Field Any(Runner runner, Node block)
 {
     if (block.Count != 2)
     {
         throw new ArgumentException();
     }
     return(runner.Eval(block[0]).Contains(runner.Eval(block[1])));
 }
예제 #2
0
        public static Field ShiftRight(Runner runner, Node block)
        {
            if (block.Count != 2)
            {
                throw new ArgumentException();
            }
            var a = runner.Eval(block[0]).IntValue;
            var b = (int)runner.Eval(block[1]);

            return((a >> b) & RunnerHelper.MAX_SAFE_INTEGER);
        }
예제 #3
0
        public static Field Atan(Runner runner, Node block)
        {
            if (block.Count < 1 || block.Count > 2)
            {
                throw new ArgumentException();
            }
            var a = runner.Eval(block[0]).FloatValue;

            if (block.Count == 2)
            {
                var b = runner.Eval(block[1]).FloatValue;
                return(Math.Atan2(a, b));
            }
            return(Math.Atan(a));
        }
예제 #4
0
        public static Field ToChar(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var str   = runner.Eval(block[0]);
            var start = (int)runner.Eval(block[1]);

            if (start < 0)
            {
                start = str.Count + start;
            }
            return((long)str[start]);
        }
예제 #5
0
 public Field Invoke(Runner runner, Node node)
 {
     try {
         runner.PushContext();
         for (int i = 0, l = Math.Min(arguments.Count, node.Count); i < l; i++)
         {
             runner.SetField(
                 runner.Eval(arguments[i]).StringValue,
                 runner.Eval(node[i]));
         }
         return(runner.Eval(body));
     } finally {
         runner.PopContext();
     }
 }
예제 #6
0
 public static Field Return(Runner runner, Node block)
 {
     if (block.Count > 1)
     {
         throw new ArgumentException();
     }
     return(block.Count == 1 ? runner.Eval(block[0]) : default);
예제 #7
0
        public static Field TypeOf(Runner runner, Node block)
        {
            if (block.Count != 1)
            {
                throw new ArgumentException();
            }
            switch (runner.Eval(block[1]).FieldType)
            {
            case FieldType.Unassigned: return("undefined");

            case FieldType.Integer: return("integer");

            case FieldType.Float: return("float");

            case FieldType.String: return("string");

            case FieldType.Object: return("object");

            case FieldType.Array: return("array");

            case FieldType.Function:
            case FieldType.BuiltInFunction: return("function");

            default: return("unknown");
            }
        }
예제 #8
0
파일: Field.cs 프로젝트: JLChnToZ/Katana
        public Field Invoke(Runner runner, Node node)
        {
            switch (fieldType)
            {
            case FieldType.BuiltInFunction:
            case FieldType.Function:
                return((objValue as IFunction).Invoke(runner, node));

            case FieldType.Array:
            case FieldType.Object:
                var value = this;
                for (int i = 1, l = node.Count; i < l; i++)
                {
                    value = value.GetAndEnsureType(
                        runner.Eval(node[i]),
                        i < l - 1 ? FieldType.Object : FieldType.Unassigned);
                }
                return(value);

            default:
                if (node.Count > 0)
                {
                    throw new InvalidCastException();
                }
                return(this);
            }
        }
예제 #9
0
        public static Field Substract(Runner runner, Node block)
        {
            if (block.Count < 1)
            {
                throw new ArgumentException();
            }
            double?result = null;

            foreach (var child in block)
            {
                var v = runner.Eval(child).FloatValue;
                if (result.HasValue)
                {
                    result += v;
                }
                else
                {
                    result = -v;
                }
            }
            if (block.Count > 1)
            {
                result = -result;
            }
            return(result.GetValueOrDefault(double.NaN));
        }
예제 #10
0
        public static Field Not(Runner runner, Node block)
        {
            if (block.Count != 1)
            {
                throw new ArgumentException();
            }
            var a = runner.Eval(block[0]).IntValue;

            return((~a) & RunnerHelper.MAX_SAFE_INTEGER);
        }
예제 #11
0
        public static Field CreateArray(Runner runner, Node block)
        {
            Field result = new Field(FieldType.Array, block.Count);

            foreach (var child in block)
            {
                result.Add(runner.Eval(child));
            }
            return(result);
        }
예제 #12
0
        public static Field Tanh(Runner runner, Node block)
        {
            if (block.Count != 1)
            {
                throw new ArgumentException();
            }
            var a = runner.Eval(block[0]).FloatValue;

            return(Math.Tanh(a));
        }
예제 #13
0
        public static Field Slice(Runner runner, Node block)
        {
            if (block.Count < 2 || block.Count > 3)
            {
                throw new ArgumentException();
            }
            var src   = runner.Eval(block[0]);
            var start = (int)runner.Eval(block[1]);
            var end   = block.Count == 2 ? (int)runner.Eval(block[2]) : 0;

            if (src.FieldType == FieldType.Array)
            {
                if (start < 0)
                {
                    start = src.Count + start;
                }
                if (end <= 0)
                {
                    end = src.Count + end;
                }
                Field result = new Field(FieldType.Array);
                result.Capacity = end - start;
                for (int i = start; i < end; i++)
                {
                    result.Add(src[i]);
                }
                return(result);
            }
            else
            {
                var str = src.StringValue;
                if (start < 0)
                {
                    start = str.Length + start;
                }
                if (end <= 0)
                {
                    end = str.Length + end;
                }
                return(str.Substring(start, end - start));
            }
        }
예제 #14
0
        public static Field Delete(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var target = runner.Eval(block[0]);

            switch (target.FieldType)
            {
            case FieldType.Array:
                switch (block.Count)
                {
                case 3:
                    target.RemoveRange(
                        (int)runner.Eval(block[1]),
                        (int)runner.Eval(block[2])
                        );
                    break;

                case 2:
                    target.RemoveAt((int)runner.Eval(block[1]));
                    break;

                default:
                    throw new ArgumentException();
                }
                break;

            case FieldType.Object:
                for (int i = 1, l = block.Count; i < l; i++)
                {
                    target.Remove(runner.Eval(block[i]));
                }
                break;

            default:
                throw new ArgumentException();
            }
            return(target);
        }
예제 #15
0
        public static Field SetValue(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var tag = Convert.ToString(block[0]);

            if (block.Count == 2)
            {
                return(runner.SetField(tag, runner.Eval(block[1])));
            }
            Field field = runner.GetFieldOrInit(tag, FieldType.Object);

            for (int i = 1, l = block.Count - 2; i < l; i++)
            {
                field = field.GetAndEnsureType(runner.Eval(block[i]), FieldType.Object);
            }
            return(field[runner.Eval(block[block.Count - 2])] =
                       runner.Eval(block[block.Count - 1]));
        }
예제 #16
0
        public static Field FromChar(Runner runner, Node block)
        {
            if (block.Count < 1)
            {
                throw new ArgumentException();
            }
            var result = new char[block.Count];

            for (int i = 0, l = block.Count; i < l; i++)
            {
                result[i] = (char)runner.Eval(block[0]);
            }
            return(new string(result));
        }
예제 #17
0
        public static Field ToCharArray(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var   str    = runner.Eval(block[0]).StringValue;
            Field result = new Field(FieldType.Array, str.Length);

            foreach (char c in str)
            {
                result.Add(c);
            }
            return(result);
        }
예제 #18
0
        public static Field Max(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            double result = double.NegativeInfinity;

            foreach (var child in block)
            {
                var v = runner.Eval(child).FloatValue;
                result = Math.Max(result, v);
            }
            return(result);
        }
예제 #19
0
        public static Field GetValue(Runner runner, Node block)
        {
            if (block.Count < 1)
            {
                throw new ArgumentException();
            }
            var   tag   = Convert.ToString(block[0]);
            Field field = runner.GetFieldOrInit(tag,
                                                block.Count > 2 ? FieldType.Object : FieldType.Unassigned);

            for (int i = 1, l = block.Count; i < l; i++)
            {
                field = field.GetAndEnsureType(
                    runner.Eval(block[i]),
                    i < l - 1 ? FieldType.Object : FieldType.Unassigned);
            }
            return(field);
        }
예제 #20
0
        public static Field GreaterThenEquals(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            double compareNum = double.PositiveInfinity;

            foreach (var child in block)
            {
                var v = runner.Eval(child).FloatValue;
                if (compareNum < v)
                {
                    return(0);
                }
                compareNum = v;
            }
            return(1);
        }
예제 #21
0
        public static Field OrElse(Runner runner, Node block)
        {
            if (block.Count < 1)
            {
                throw new ArgumentException();
            }
            Field result = default;

            foreach (var child in block)
            {
                var nextResult = runner.Eval(child);
                if (nextResult.IsTruly)
                {
                    return(nextResult);
                }
                result = nextResult;
            }
            return(result);
        }
예제 #22
0
        public static Field RunSequence(Runner runner, Node block)
        {
            if (block.Count < 1)
            {
                throw new ArgumentException();
            }
            Field result = default;

            foreach (var child in block)
            {
                result = runner.Eval(child);
                var field = runner.GetFieldOrInit(Convert.ToString(child));
                if (field.FieldType == FieldType.BuiltInFunction &&
                    field.Value == index["return"])
                {
                    return(result);
                }
            }
            return(result);
        }
예제 #23
0
        public static Field Length(Runner runner, Node block)
        {
            if (block.Count != 1)
            {
                throw new ArgumentException();
            }
            var obj = runner.Eval(block[1]);

            switch (obj.FieldType)
            {
            case FieldType.String:
                return(obj.StringValue.Length);

            case FieldType.Array:
            case FieldType.Object:
                return(obj.Count);

            default:
                return(0);
            }
        }
예제 #24
0
        public static Field Pow(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            double?result = null;

            foreach (var child in block)
            {
                var v = runner.Eval(child).FloatValue;
                if (result.HasValue)
                {
                    result = Math.Pow(result.Value, v);
                }
                else
                {
                    result = v;
                }
            }
            return(result.GetValueOrDefault(double.NaN));
        }
예제 #25
0
        public static Field Xor(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            long?result = null;

            foreach (var child in block)
            {
                var v = runner.Eval(child).IntValue;
                if (result.HasValue)
                {
                    result ^= v;
                }
                else
                {
                    result = v;
                }
            }
            return(result.GetValueOrDefault(0));
        }
예제 #26
0
        public static Field Equals(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var    compareFieldType = FieldType.Unassigned;
            string compareStr       = null;
            double compareNum       = double.NaN;
            object compareObj       = null;

            foreach (var child in block)
            {
                var v = runner.Eval(child);
                switch (compareFieldType)
                {
                case FieldType.Unassigned:
                    switch (v.FieldType)
                    {
                    case FieldType.String:
                        compareFieldType = FieldType.String;
                        compareStr       = v.StringValue;
                        break;

                    case FieldType.Integer:
                    case FieldType.Float:
                        compareFieldType = FieldType.Float;
                        compareNum       = v.FloatValue;
                        break;
                    }
                    compareFieldType = FieldType.Object;
                    compareObj       = v;
                    break;

                case FieldType.String:
                    if (v.StringValue != compareStr)
                    {
                        return(0);
                    }
                    break;

                case FieldType.Float:
                    if (v.FloatValue != compareNum)
                    {
                        return(0);
                    }
                    break;

                case FieldType.Object:
                    if (v.Value != compareObj)
                    {
                        return(0);
                    }
                    break;

                default:
                    throw new ArgumentException();
                }
            }
            switch (compareFieldType)
            {
            case FieldType.Float:
            case FieldType.String:
            case FieldType.Object:
                return(1);

            default:
                throw new ArgumentException();
            }
        }
예제 #27
0
        public static Field Add(Runner runner, Node block)
        {
            if (block.Count < 2)
            {
                throw new ArgumentException();
            }
            var           fieldType  = FieldType.Unassigned;
            StringBuilder resultStr  = null;
            double?       resultNum  = null;
            Field         resultList = default;

            foreach (var child in block)
            {
                var v = runner.Eval(child);
                switch (fieldType)
                {
                case FieldType.Unassigned:
                    switch (v.FieldType)
                    {
                    case FieldType.String:
                        fieldType = FieldType.String;
                        resultStr = new StringBuilder((string)v);
                        break;

                    case FieldType.Integer:
                    case FieldType.Float:
                        fieldType = FieldType.Float;
                        resultNum = v.FloatValue;
                        break;

                    case FieldType.Array:
                        fieldType  = FieldType.Array;
                        resultList = v;
                        break;

                    default:
                        throw new ArgumentException();
                    }
                    break;

                case FieldType.Array:
                    if (v.FieldType == FieldType.Array)
                    {
                        foreach (var entry in v)
                        {
                            resultList.Add(entry);
                        }
                    }
                    else
                    {
                        resultList.Add(v);
                    }
                    break;

                case FieldType.String:
                    resultStr.Append(v);
                    break;

                case FieldType.Float:
                    resultNum += v.FloatValue;
                    break;

                default:
                    throw new ArgumentException();
                }
            }
            switch (fieldType)
            {
            case FieldType.Float:
                return(resultNum.GetValueOrDefault(double.NaN));

            case FieldType.String:
                return(resultStr.ToString());

            case FieldType.Array:
                return(resultList);

            default:
                throw new ArgumentException();
            }
        }