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