예제 #1
0
        static Object.Object push(List <Object.Object> args)
        {
            if (args.Count != 2)
            {
                return(evaluator.newError("wrong number of arguments. got={0}, want=2", args.Count.ToString()));
            }

            if (args[0].Type() != Object._ObjectType.ARRAY_OBJ)
            {
                return(evaluator.newError("argument to 'push' must be ARRAY. got={0}", args[0].Type()));
            }

            Object.Array arr    = (Object.Array)args[0];
            int          length = arr.Elements.Count;

            List <Object.Object> newElements = new List <Object.Object>(new Object.Object[length + 1]);

            for (int i = 0; i < length; i++)
            {
                newElements[i] = arr.Elements[i];
            }
            newElements[length] = args[1];

            return(new Object.Array {
                Elements = newElements
            });
        }
예제 #2
0
        static Object.Object rest(List <Object.Object> args)
        {
            if (args.Count != 1)
            {
                return(evaluator.newError("wrong number of arguments. got={0}, want=1", args.Count.ToString()));
            }

            if (args[0].Type() != Object._ObjectType.ARRAY_OBJ)
            {
                return(evaluator.newError("argument to 'rest' must be ARRAY. got={0}", args[0].Type()));
            }

            Object.Array arr    = (Object.Array)args[0];
            int          length = arr.Elements.Count;

            if (length > 0)
            {
                List <Object.Object> newElements = new List <Object.Object>(new Object.Object[length - 1]);

                for (int i = 1; i < length; i++)
                {
                    newElements[i - 1] = arr.Elements[i];
                }

                return(new Object.Array {
                    Elements = newElements
                });
            }

            return(evaluator.NULL);
        }
예제 #3
0
        static Object.Object evalArrayIndexExpression(Object.Object array, Object.Object index)
        {
            Object.Array arrayObject = (Object.Array)array;
            long         idx         = ((Object.Integer)index).Value;
            long         max         = (long)(arrayObject.Elements.Count - 1);

            if (idx < 0 || idx > max)
            {
                return(NULL);
            }

            return(arrayObject.Elements[(int)idx]);
        }
예제 #4
0
        static error executeArrayIndex(Object.Object array, Object.Object index)
        {
            Object.Array arrayOject = (Object.Array)array;
            long         i          = ((Object.Integer)index).Value;
            long         max        = (long)(arrayOject.Elements.Count - 1);

            if (i < 0 || i > max)
            {
                return(push(Null));
            }

            return(push(arrayOject.Elements[(int)i]));
        }
예제 #5
0
        static Object.Object first(List <Object.Object> args)
        {
            if (args.Count != 1)
            {
                return(evaluator.newError("wrong number of arguments. got={0}, want=1", args.Count.ToString()));
            }

            if (args[0].Type() != Object._ObjectType.ARRAY_OBJ)
            {
                return(evaluator.newError("argument to 'first' must be ARRAY. got={0}", args[0].Type()));
            }

            Object.Array arr = (Object.Array)args[0];
            if (arr.Elements.Count > 0)
            {
                return(arr.Elements[0]);
            }

            return(evaluator.NULL);
        }