Exemplo n.º 1
0
        public void EvalDyad(RCRunner runner, RCClosure closure, RCString left, object right)
        {
            RCBlock    block = (RCBlock)right;
            RCOperator op    = RCSystem.Activator.New(left[0], block.Get("l"), block.Get("r"));

            runner.Yield(closure, op);
        }
Exemplo n.º 2
0
        public void EvalSwaplr(RCRunner runner, RCClosure closure, RCOperator right)
        {
            if (right.Left == null || right.Right == null)
            {
                throw new Exception("swaplr requires both left and right arguments");
            }
            RCOperator result = RCSystem.Activator.New(right.Name, right.Right, right.Left);

            runner.Yield(closure, result);
        }
Exemplo n.º 3
0
        public void EvalMonadic(RCRunner runner, RCClosure closure, object right)
        {
            RCOperator op = (RCOperator)closure.Code;

            runner.Yield(closure,
                         VectorMath.InvokeMonadic(
                             closure,
                             op.Name,
                             (RCVectorBase)right));
        }
Exemplo n.º 4
0
        public void EvalRightContextual(RCRunner runner, RCClosure closure, object left, object right)
        {
            RCOperator op = (RCOperator)closure.Code;

            runner.Yield(closure,
                         VectorMath.InvokeDyadic(
                             closure,
                             op.Name,
                             (RCVectorBase)right,
                             (RCVectorBase)left));
        }
Exemplo n.º 5
0
        public void EvalDyadic(RCRunner runner, RCClosure closure, object left, object right)
        {
            // Brian! come back here to prevent the native exception
            RCOperator   op          = (RCOperator)closure.Code;
            RCVectorBase leftVector  = left as RCVectorBase;
            RCVectorBase rightVector = right as RCVectorBase;

            if (leftVector == null || rightVector == null)
            {
                throw RCException.Overload(closure, op.Name, left, right);
            }
            runner.Yield(closure, VectorMath.InvokeDyadic(closure, op.Name, leftVector, rightVector));
        }
Exemplo n.º 6
0
        protected void DoTree(TreeNode parent, RCOperator right, ref double a, ref double g)
        {
            // This is not quite correct. Operators should have more space allocated like
            // blocks.
            // And not always assigned an area of one. TestTree16 and others will have to
            // change.
            TreeNode opNode = new TreeNode(parent, null, 0);

            opNode.n = 1;
            opNode.m = 1;
            opNode.g = 1;
            opNode.v = right.ToString();
            a       += opNode.n;
            g       += Math.Abs(opNode.n);
        }
Exemplo n.º 7
0
 public void EvalCount(RCRunner runner, RCClosure closure, RCOperator right)
 {
     runner.Yield(closure, new RCLong(right.Count));
 }
Exemplo n.º 8
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;
                }
            }
        }
Exemplo n.º 9
0
        public void EvalMonad(RCRunner runner, RCClosure closure, RCString left, object right)
        {
            RCOperator op = RCSystem.Activator.New(left[0], (RCValue)right);

            runner.Yield(closure, op);
        }
Exemplo n.º 10
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;
                }
            }
        }