public DefaultBasicHost(IBasicInputOutput io = null) { this.io = io ?? new TextWriterIO(Console.Out); }
public override BasicNode Eval(BasicEnvironment env) { env.InstructionCount++; runtime = env; printer = env.printer; bool suppressNL = false; for (int i = 0; i < items.Count; i++) { suppressNL = false; var item = items[i]; var node = item as BasicNode; if (node != null) { node = node.Eval(env); if (node.IsAbort()) { return(node); } var sNode = node as StringConstantNode; if (sNode != null) { WriteString(sNode.Text); continue; } var nNode = node as NumericConstantNode; if (nNode != null) { WriteNumericConstant(nNode); continue; } var cNode = node as ControlNode; if (cNode.Kind == EvalResultKind.Tab) { var numNode = cNode.Target as NumericConstantNode; int amount = numNode.IntValue; if (amount <= 0) { env.RuntimeError(ERuntimeErrors.InvalidTab, amount); amount = 1; } amount--; if (runtime.Column < amount) { WriteString(new string(' ', amount - runtime.Column)); } else { printer.NewLine(); WriteString(new string(' ', amount)); } continue; } return(env.RuntimeError()); } var sval = item as string; if (sval == ",") { int rem = runtime.Column % printer.PrintZoneWidth; rem = printer.PrintZoneWidth - rem; WriteString(new string(' ', rem)); } if (sval == ";" || sval == ",") { suppressNL = true; continue; } return(env.RuntimeError()); } if (!suppressNL) { runtime.Column = 0; printer.NewLine(); } return(this); }