Пример #1
0
        protected void DoTree(TreeNode parent, RCReference right, ref double a, ref double g)
        {
            TreeNode child = new TreeNode(parent, null, 0);

            child.n = 1;
            child.m = 1;
            child.g = 1;
            child.v = right.ToString();
            a      += child.n;
            g      += Math.Abs(child.n);
        }
Пример #2
0
        public void EvalModule(RCRunner runner, RCClosure closure, RCBlock right)
        {
            RCArray <RCReference> references = new RCArray <RCReference> ();
            RCBlock result = (RCBlock)right.Edit(runner,
                                                 delegate(RCValue val)
            {
                RCReference reference = val as RCReference;
                if (reference != null)
                {
                    RCReference r = new RCReference(reference.Name);
                    references.Write(r);
                    return(r);
                }
                RCUserOperator op = val as RCUserOperator;
                if (op != null)
                {
                    RCReference r = new RCReference(op.Name);
                    references.Write(r);
                    RCUserOperator outop = new RCUserOperator(r);
                    outop.Init(op.Name, op.Left, op.Right);
                    return(outop);
                }
                else
                {
                    return(null);
                }
            });

            // Ugh there must be some better way than this.
            // But sometimes you just need to modify a value after allocation.
            // We can use the Lock() mechanism to tighten this up at least.
            // SetStatic will throw an exception if you call it after Lock().
            for (int i = 0; i < references.Count; ++i)
            {
                references[i].SetStatic(result);
            }
            runner.Yield(closure, result);
        }
Пример #3
0
 public void EvalCount(RCRunner runner, RCClosure closure, RCReference right)
 {
     runner.Yield(closure, new RCLong(right.Count));
 }
Пример #4
0
        protected void DoTree(TreeNode parent, RCBlock right, ref double a, ref double g)
        {
            for (int i = 0; i < right.Count; ++i)
            {
                RCBlock current   = right.GetName(i);
                object  shortName = current.Name;
                if (shortName.Equals(""))
                {
                    shortName = (long)i;
                }
                RCSymbolScalar s    = new RCSymbolScalar(parent.s, (long)i);
                RCSymbolScalar n    = new RCSymbolScalar(parent.k, shortName);
                TreeNode       node = new TreeNode(s, n);
                node.v        = current.Name;
                node.children = new RCArray <TreeNode> ();
                RCVectorBase vector = current.Value as RCVectorBase;
                if (vector != null)
                {
                    switch (vector.TypeCode)
                    {
                    case 'l': DoTree <long> (node,
                                             (RCVector <long>)vector,
                                             ref node.n,
                                             ref node.g,
                                             Areal,
                                             Formatl); break;

                    case 'd': DoTree <double> (node,
                                               (RCVector <double>)vector,
                                               ref node.n,
                                               ref node.g,
                                               Aread,
                                               Formatd); break;

                    case 'm': DoTree <decimal> (node,
                                                (RCVector <decimal>)vector,
                                                ref node.n,
                                                ref node.g,
                                                Aream,
                                                Formatm); break;

                    case 's': DoTree <string> (node,
                                               (RCVector <string>)vector,
                                               ref node.n,
                                               ref node.g,
                                               Areas,
                                               Formats); break;

                    case 'x': DoTree <byte> (node,
                                             (RCVector <byte>)vector,
                                             ref node.n,
                                             ref node.g,
                                             Areax,
                                             Formatx); break;

                    case 'y': DoTree <RCSymbolScalar> (node,
                                                       (RCVector <RCSymbolScalar>)vector,
                                                       ref node.n,
                                                       ref
                                                       node.g,
                                                       Areay,
                                                       Formaty); break;

                    case 'b': DoTree <bool> (node,
                                             (RCVector <bool>)vector,
                                             ref node.n,
                                             ref node.g,
                                             Areab,
                                             Formatb); break;

                    default: throw new Exception("Unknown typecode: " + vector.TypeCode);
                    }
                    a += node.n;
                    g += Math.Abs(node.g);
                    parent.children.Write(node);
                    continue;
                }
                RCBlock block = current.Value as RCBlock;
                if (block != null)
                {
                    DoTree(node, block, ref node.n, ref node.g);
                    a += node.n;
                    g += Math.Abs(node.g);
                    parent.children.Write(node);
                    continue;
                }
                RCCube cube = current.Value as RCCube;
                if (cube != null)
                {
                    DoTree(node, cube, ref node.n, ref node.g);
                    a += node.n;
                    g += Math.Abs(node.g);
                    parent.children.Write(node);
                    continue;
                }
                RCOperator oper = current.Value as RCOperator;
                if (oper != null)
                {
                    DoTree(node, oper, ref node.n, ref node.g);
                    a += node.n;
                    g += Math.Abs(node.g);
                    parent.children.Write(node);
                    continue;
                }
                RCReference reference = current.Value as RCReference;
                if (reference != null)
                {
                    DoTree(node, reference, ref node.n, ref node.g);
                    a += node.n;
                    g += Math.Abs(node.g);
                    parent.children.Write(node);
                    continue;
                }
            }
        }
Пример #5
0
        protected void DoChart(RCCube result,
                               RCSymbolScalar parent,
                               ref long row,
                               long col,
                               RCBlock
                               right)
        {
            for (int i = 0; i < right.Count; ++i)
            {
                RCBlock current   = right.GetName(i);
                object  shortName = current.Name;
                if (shortName.Equals(""))
                {
                    shortName = (long)i;
                }
                RCSymbolScalar name = new RCSymbolScalar(parent, shortName);
                RCSymbolScalar cell = RCSymbolScalar.From(row, col, 0L);
                result.WriteCell("r", cell, row);
                result.WriteCell("c", cell, col);
                result.WriteCell("l", cell, 0L);
                result.WriteCell("k", cell, name);
                result.WriteCell("v", cell, shortName is long?shortName.ToString() : shortName);
                result.Axis.Write(cell);
                RCVectorBase vector = current.Value as RCVectorBase;
                if (vector != null)
                {
                    ++col;
                    switch (vector.TypeCode)
                    {
                    case 'l': DoChart <long> (result, name, row, col, (RCVector <long>)vector); break;

                    case 'd': DoChart <double> (result, name, row, col, (RCVector <double>)vector); break;

                    case 'm': DoChart <decimal> (result, name, row, col, (RCVector <decimal>)vector); break;

                    case 's': DoChart <string> (result, name, row, col, (RCVector <string>)vector); break;

                    case 'x': DoChart <byte> (result, name, row, col, (RCVector <byte>)vector); break;

                    case 'y': DoChart <RCSymbolScalar> (result,
                                                        name,
                                                        row,
                                                        col,
                                                        (RCVector <RCSymbolScalar>)vector); break;

                    case 'b': DoChart <bool> (result, name, row, col, (RCVector <bool>)vector); break;

                    default: throw new Exception("Unknown typecode: " + vector.TypeCode);
                    }
                    --col;
                    ++row;
                    continue;
                }
                RCBlock block = current.Value as RCBlock;
                if (block != null)
                {
                    ++col;
                    ++row;
                    DoChart(result, name, ref row, col, block);
                    --col;
                    continue;
                }
                RCOperator oper = current.Value as RCOperator;
                if (oper != null)
                {
                    ++col;
                    string val = oper.ToString();
                    cell = RCSymbolScalar.From(row, col, 0L);
                    result.WriteCell("r", cell, (long)row);
                    result.WriteCell("c", cell, (long)col);
                    result.WriteCell("l", cell, 0L);
                    result.WriteCell("k", cell, new RCSymbolScalar(name, 0L));
                    result.WriteCell("v", cell, val);
                    result.Write(cell);
                    ++row;
                    --col;
                    continue;
                }
                RCReference reference = current.Value as RCReference;
                if (reference != null)
                {
                    ++col;
                    string val = reference.ToString();
                    cell = RCSymbolScalar.From(row, col, 0L);
                    result.WriteCell("r", cell, (long)row);
                    result.WriteCell("c", cell, (long)col);
                    result.WriteCell("l", cell, 0L);
                    result.WriteCell("k", cell, new RCSymbolScalar(name, 0L));
                    result.WriteCell("v", cell, val);
                    result.Write(cell);
                    ++row;
                    --col;
                    continue;
                }
                RCCube cube = current.Value as RCCube;
                if (cube != null)
                {
                    ++col;
                    ++row;
                    DoChart(result, name, ref row, col, cube);
                    ++row;
                    --col;
                    continue;
                }
            }
        }