private object CompileList(CompileHelper helper, params string[] opers) { var list = new Vector(); CompileList(list, helper, opers); // Return the shortest code. if (list.Count == 0) { return(null); } else if (list.Count == 1) { return(list[0]); } else { object code = list[0]; for (var i = 1; i < list.Count; i += 2) { var lispOper = GetLispOperator(list[i]); if (SupportsMany(lispOper) && code is Cons && Runtime.First(code) == lispOper) { code = Runtime.Append((Cons)code, Runtime.MakeList(list[i + 1])); } else { code = Runtime.MakeList(lispOper, code, list[i + 1]); } } return(code); } }
public static IEnumerable Partition(bool all, int size, int step, IEnumerable pad, IEnumerable seq) { if (size <= 0) { throw new LispException("Invalid size: {0}", size); } if (step <= 0) { throw new LispException("Invalid step: {0}", step); } // We never need more than size-1 pad elements var source = Runtime.Append(seq, Take(size - 1, pad)); var v = new Vector(); while (source != null) { while (source != null && v.Count < size) { v.Add(Car(source)); source = Cdr(source); } if (all || v.Count == size) { yield return(AsList(v)); } if (source != null) { if (step < size) { v.RemoveRange(0, step); } else if (size < step) { source = Runtime.Drop(step - size, source); v.Clear(); } else { v.Clear(); } } } }