示例#1
0
        private void StandardTaggedObj(ushort tagId, Obj obj)
        {
            writer.Write(Cell.Runtime.SymbObj.IdxToStr(tagId));

            if (!obj.IsNeRecord() && (!obj.IsNeSeq() || obj.GetSize() == 1))
            {
                writer.Write('(');

                if (IsMultiline(obj))
                {
                    writer.IndentedNewLine();
                    obj.Visit(this);
                    writer.UnindentedNewLine();
                }
                else
                {
                    obj.Visit(this);
                }

                writer.Write(')');
            }
            else
            {
                obj.Visit(this);
            }
        }
示例#2
0
        public static void Print(Obj obj, DataWriter writer)
        {
            // ObjPrinter printer = new ObjPrinter(writer, new HashSet<Obj>(new IdentityEqualityComparer<Obj>()));
            ObjPrinter printer = new ObjPrinter(writer, new HashSet <Obj>());

            obj.Visit(printer);
            writer.Flush();
        }
示例#3
0
        public static void Print(Obj obj, DataWriter writer, int maxLineLen)
        {
            HashSet <Obj> multilineObjs = Multiliner.MultilineObjs(obj, maxLineLen);
            ObjPrinter    printer       = new ObjPrinter(writer, multilineObjs);

            obj.Visit(printer);
            writer.Flush();
        }
示例#4
0
            private int ObjSize(Obj obj)
            {
                if (done)
                {
                    return(0);
                }
                obj.Visit(this);
                Debug.Assert(lastVisitedObjSize != -1);
                int size = lastVisitedObjSize;

                lastVisitedObjSize = -1;
                if (size > maxLineLen)
                {
                    if (multilineObjs != null)
                    {
                        //## HACK HACK HACK
                        if (obj is NeTreeMapObj)
                        {
                            multilineObjs.Add(((NeTreeMapObj)obj).Packed());
                        }
                        else if (obj is NeTreeSetObj)
                        {
                            multilineObjs.Add(((NeTreeSetObj)obj).Packed());
                        }
                        else
                        {
                            multilineObjs.Add(obj);
                        }
                    }
                    if (bailEarly)
                    {
                        done = true;
                    }
                }
                return(size);
            }
示例#5
0
        public void NeTernRelObj(NeTernRelObj obj)
        {
            Obj[] col1 = obj.Col1();
            Obj[] col2 = obj.Col2();
            Obj[] col3 = obj.Col3();
            int   len  = col1.Length;

            writer.Write('[');

            if (IsMultiline(obj))
            {
                writer.Indent();
                if (writer.IsNewLine())
                {
                    writer.Write(' ');
                }
                else
                {
                    writer.NewLine();
                }

                for (int i = 0; i < len; i++)
                {
                    Obj arg1 = col1[i];
                    Obj arg2 = col2[i];
                    Obj arg3 = col3[i];

                    bool multiline = IsMultiline(arg1) || IsMultiline(arg2) || IsMultiline(arg3);

                    arg1.Visit(this);
                    writer.Write(",");
                    if (multiline)
                    {
                        writer.NewLine();
                    }
                    else
                    {
                        writer.Write(' ');
                    }

                    arg2.Visit(this);
                    writer.Write(",");
                    if (multiline)
                    {
                        writer.NewLine();
                    }
                    else
                    {
                        writer.Write(' ');
                    }

                    arg3.Visit(this);

                    if (i == 0 | i < len - 1)
                    {
                        writer.Write(";");
                    }
                    writer.NewLine();
                }

                writer.UnindentedNewLine();
            }
            else
            {
                for (int i = 0; i < len; i++)
                {
                    if (i > 0)
                    {
                        writer.Write("; ");
                    }
                    col1[i].Visit(this);
                    writer.Write(", ");
                    col2[i].Visit(this);
                    writer.Write(", ");
                    col3[i].Visit(this);
                }

                if (len == 1)
                {
                    writer.Write(';');
                }
            }

            writer.Write(']');
        }
示例#6
0
        private void Map(NeBinRelObj obj)
        {
            Obj[] col1 = obj.Col1();
            Obj[] col2 = obj.Col2();
            int   len  = col1.Length;

            writer.Write('[');

            if (IsMultiline(obj))
            {
                writer.Indent();
                if (writer.IsNewLine())
                {
                    writer.Write(' ');
                }
                else
                {
                    writer.NewLine();
                }

                for (int i = 0; i < len; i++)
                {
                    Obj arg1 = col1[i];
                    Obj arg2 = col2[i];

                    arg1.Visit(this);
                    writer.Write(" ->");

                    if (IsMultiline(arg2))
                    {
                        writer.IndentedNewLine();
                        arg2.Visit(this);
                        writer.Unindent();
                    }
                    else
                    {
                        writer.Write(' ');
                        arg2.Visit(this);
                    }

                    if (i < len - 1)
                    {
                        writer.Write(',');
                    }
                    else
                    {
                        writer.Unindent();
                    }
                    writer.NewLine();
                }
            }
            else
            {
                for (int i = 0; i < len; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }

                    col1[i].Visit(this);
                    writer.Write(" -> ");
                    col2[i].Visit(this);
                }
            }

            writer.Write(']');
        }
示例#7
0
        public static void PrintNoFlush(Obj obj, DataWriter writer)
        {
            ObjPrinter printer = new ObjPrinter(writer, new HashSet <Obj>());

            obj.Visit(printer);
        }
示例#8
0
        private void Record(NeBinRelObj obj)
        {
            Obj[] values = obj.Col2();
            int   len    = values.Length;

            ushort[] labels;
            if (obj is RecordObj)
            {
                RecordObj recObj = (RecordObj)obj;
                labels = recObj.fieldIds;
            }
            else
            {
                labels = new ushort[len];
                Obj[] fields = obj.Col1();
                for (int i = 0; i < len; i++)
                {
                    labels[i] = fields[i].GetSymbId();
                }
            }

            writer.Write('(');

            if (IsMultiline(obj))
            {
                int maxLabelLen = 0;
                for (int i = 0; i < len; i++)
                {
                    int labelLen = Cell.Runtime.SymbObj.IdxToStr(labels[i]).Length;
                    if (labelLen > maxLabelLen)
                    {
                        maxLabelLen = labelLen;
                    }
                }

                int[] idxs = SortedIdxs(labels, values);

                writer.Indent();
                if (writer.IsNewLine())
                {
                    writer.Write(' ');
                }
                else
                {
                    writer.NewLine();
                }

                for (int i = 0; i < len; i++)
                {
                    int    idx   = idxs[i];
                    string label = Cell.Runtime.SymbObj.IdxToStr(labels[idx]);
                    writer.Write(label);
                    writer.Write(':');

                    Obj value = values[idx];
                    if (IsMultiline(value))
                    {
                        writer.IndentedNewLine();
                        value.Visit(this);
                        writer.Unindent();
                    }
                    else
                    {
                        writer.WriteSpaces(maxLabelLen - label.Length + 1);
                        value.Visit(this);
                    }

                    if (i < len - 1)
                    {
                        writer.Write(',');
                    }
                    else
                    {
                        writer.Unindent();
                    }
                    writer.NewLine();
                }
            }
            else
            {
                for (int i = 0; i < len; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }
                    writer.Write(Cell.Runtime.SymbObj.IdxToStr(labels[i]));
                    writer.Write(": ");
                    values[i].Visit(this);
                }
            }

            writer.Write(')');
        }