예제 #1
0
        public override Value Execute(Args args, Environment environment, SourcePos pos)
        {
            var env    = environment.NewEnv();
            var lst    = args.GetAsList("lst");
            var cmp    = args.HasArg("cmp") ? args.GetFunc("cmp") : environment.Get("compare", pos).AsFunc();
            var key    = args.HasArg("key") ? args.GetFunc("key") : environment.Get("identity", pos).AsFunc();
            var result = new List <Value>();

            result.AddRange(lst.GetValue());
            for (var i = 1; i < result.Count; i++)
            {
                var v = key.Execute(new Args(key.GetArgNames()[0], result[i], pos), env, pos);
                for (var j = i - 1; j >= 0; j--)
                {
                    var v2         = key.Execute(new Args(key.GetArgNames()[0], result[j], pos), env, pos);
                    var cmpargs    = new Args(cmp.GetArgNames()[0], cmp.GetArgNames()[1], v, v2, pos);
                    var comparison = (int)cmp.Execute(cmpargs, env, pos).AsInt().GetValue();
                    if (comparison < 0)
                    {
                        var temp = result[j + 1];
                        result[j + 1] = result[j];
                        result[j]     = temp;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(new ValueList(result));
        }
예제 #2
0
        public override Value Execute(Args args, Environment environment, SourcePos pos)
        {
            if (args.IsNull("obj"))
            {
                return(ValueNull.NULL);
            }
            var obj = args.Get("obj");
            var key = args.HasArg("key") ? args.GetFunc("key") : null;

            if (obj.IsString())
            {
                var str   = obj.AsString().GetValue();
                var start = (int)args.GetInt("start", str.Length - 1).GetValue();
                var part  = args.GetString("part").GetValue();
                return(new ValueInt(str.LastIndexOf(part, start, StringComparison.Ordinal)));
            }
            if (obj.IsList())
            {
                var env = environment;
                if (key != null)
                {
                    env = environment.NewEnv();
                }
                var item  = args.Get("part");
                var list  = obj.AsList().GetValue();
                var start = (int)args.GetInt("start", list.Count - 1).GetValue();
                for (var idx = start; idx >= 0; idx--)
                {
                    var elem = list[idx];
                    if (key != null)
                    {
                        elem = key.Execute(new Args(key.GetArgNames()[0], elem, pos), env, pos);
                    }
                    if (elem.IsEquals(item))
                    {
                        return(new ValueInt(idx));
                    }
                }
                return(new ValueInt(-1));
            }
            throw new ControlErrorException(new ValueString("ERROR"), "Find_last only works with strings and lists", pos);
        }