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); }
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); }
public void EvalMonadic(RCRunner runner, RCClosure closure, object right) { RCOperator op = (RCOperator)closure.Code; runner.Yield(closure, VectorMath.InvokeMonadic( closure, op.Name, (RCVectorBase)right)); }
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)); }
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)); }
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); }
public void EvalCount(RCRunner runner, RCClosure closure, RCOperator right) { runner.Yield(closure, new RCLong(right.Count)); }
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; } } }
public void EvalMonad(RCRunner runner, RCClosure closure, RCString left, object right) { RCOperator op = RCSystem.Activator.New(left[0], (RCValue)right); runner.Yield(closure, op); }
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; } } }