示例#1
0
        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);
            }
        }
示例#2
0
            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();
                        }
                    }
                }
            }