public static VarList Function(VarList globals) { VarList outp = new VarList(); Dictionary <string, Var> function = outp.string_vars; function["_concat"] = GenericConcat; function["_eq[function]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarFunction left = (VarFunction)arguments.number_vars[0]; VarFunction right = (VarFunction)arguments.number_vars[1]; returnTarget[returnID] = left == right ? 1 : 0; }); function["_ne[function]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarFunction left = (VarFunction)arguments.number_vars[0]; VarFunction right = (VarFunction)arguments.number_vars[1]; returnTarget[returnID] = left != right ? 1 : 0; }); function["_eq"] = ReturnZero; function["_ne"] = ReturnOne; function["_and"] = And; function["_or"] = Or; function["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = ((VarFunction)arguments.number_vars[0]).FunctionText; }); return(outp); }
public static VarList Event(VarList globals) { VarList outp = new VarList(); Dictionary <string, Var> evnt = outp.string_vars; evnt["_call"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarEvent ths = (VarEvent)arguments.number_vars[0]; int i = 0; State state = new State(); state.returns[0] = Var.nil; DoLater toDo = null; toDo = new DoLater(delegate { if (i >= ths.callbacks.Count) { return; } scope.callstack.Push(toDo); VarList newArgs = new VarList(); foreach (KeyValuePair <Var, Var> kv in arguments) { if (kv.Key is VarNumber) { double k = (double)(VarNumber)kv.Key; if (k >= 0 && k % 1 == 0) { if (k > 0) { newArgs.number_vars[k - 1] = kv.Value; } } else { newArgs.number_vars[k] = kv.Value; } } else if (kv.Key is VarString) { newArgs.string_vars[(string)(VarString)kv.Key] = kv.Value; } else { newArgs.other_vars[kv.Key] = kv.Value; } } ths.callbacks[i].Call(scope, state.returns, 0, newArgs); i++; }); scope.callstack.Push(toDo); }); evnt["_and"] = And; evnt["_or"] = Or; evnt["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = "<Event>"; }); return(outp); }
public static VarList Generate(VarList globals) { VarList table_VAR = new VarList(); Dictionary <string, Var> table = table_VAR.string_vars; table["set_meta"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ arguments.number_vars[0].meta = arguments.number_vars[1]; returnTarget[returnID] = arguments.number_vars[0]; }); table["get_meta"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = arguments.number_vars[0].meta; }); return(table_VAR); }
public static VarList Generate(VarList globals) { VarList net_VAR = new VarList(); Dictionary <string, Var> net = net_VAR.string_vars; net["connections"] = new VarList(); net["subscribe"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ string hook = (string)(VarString)arguments.number_vars[0]; VarEvent toHook; if (net["connections"].string_vars.ContainsKey(hook)) { toHook = (VarEvent)net["connections"].string_vars[hook]; } else { net["connections"].string_vars[hook] = toHook = new VarEvent(); } returnTarget[returnID] = toHook; }); net["message"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ string hook = (string)(VarString)arguments.number_vars[0]; /*Listener.subspace_messages.Enqueue(new System.Tuple<string, Var>(hook, arguments.number_vars.ContainsKey(1)?arguments.number_vars[1]:Var.nil)); * foreach(KeyValuePair<int, Program> kv in Listener.programs){ * var their_net = kv.Value.scope.globals.meta.string_vars["_parent"].string_vars["net"].string_vars; * if(their_net["connections"].string_vars.ContainsKey(hook)){ * Variable.VarList args = new Variable.VarList(); * if(arguments.number_vars.ContainsKey(1)){ * args.number_vars[0] = arguments.number_vars[1]; * args.string_vars["message"] = arguments.number_vars[1]; * } * their_net["connections"].string_vars[hook].Call(kv.Value.scope, new Dictionary<int, Variable.Var>(), 0, args); * } * }*/ returnTarget[returnID] = arguments.number_vars.ContainsKey(1) ? arguments.number_vars[1] : Var.nil; }); return(net_VAR); }
public static VarList String(VarList globals) { VarList outp = new VarList(); Dictionary <string, Var> str = outp.string_vars; str["_add"] = GenericConcat; str["_concat"] = GenericConcat; str["_index"] = globals.string_vars["string"]; str["_eq[string]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarString left = (VarString)arguments.number_vars[0]; VarString right = (VarString)arguments.number_vars[1]; returnTarget[returnID] = left.data == right.data ? 1 : 0; }); str["_ne[string]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarString left = (VarString)arguments.number_vars[0]; VarString right = (VarString)arguments.number_vars[1]; returnTarget[returnID] = left.data != right.data ? 1 : 0; }); str["_eq"] = ReturnZero; str["_ne"] = ReturnOne; str["_len"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarString left = (VarString)arguments.number_vars[0]; returnTarget[returnID] = left.data.Length; }); str["_and"] = And; str["_or"] = Or; str["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = arguments.number_vars[0]; }); str["_tonumber"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ double d = 0.0d; Double.TryParse((string)(VarString)arguments.number_vars[0], out d); returnTarget[returnID] = d; }); return(outp); }
public static VarList Generate(VarList globals) { VarList tcomm_VAR = new VarList(); Dictionary <string, Var> tcomm = tcomm_VAR.string_vars; tcomm["onmessage"] = new VarEvent(); tcomm["broadcast"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ Signal newSignal = new Signal("*beep*", "1459", "Telecomms Broadcaster", "Machine", "1", "says"); if (arguments.string_vars.ContainsKey("content") && arguments.string_vars["content"] is VarString) { newSignal.content = (string)(VarString)arguments.string_vars["content"]; } else if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString) { newSignal.content = (string)(VarString)arguments.number_vars[0]; } if (arguments.string_vars.ContainsKey("source") && arguments.string_vars["source"] is VarString) { newSignal.source = (string)(VarString)arguments.string_vars["source"]; } else if (arguments.number_vars.ContainsKey(2) && arguments.number_vars[1] is VarString) { newSignal.source = (string)(VarString)arguments.number_vars[1]; } if (arguments.string_vars.ContainsKey("job") && arguments.string_vars["job"] is VarString) { newSignal.job = (string)(VarString)arguments.string_vars["job"]; } else if (arguments.number_vars.ContainsKey(3) && arguments.number_vars[2] is VarString) { newSignal.job = (string)(VarString)arguments.number_vars[2]; } if (arguments.string_vars.ContainsKey("freq") && arguments.string_vars["freq"] is VarString) { newSignal.freq = (string)(VarString)arguments.string_vars["freq"]; } else if (arguments.number_vars.ContainsKey(3) && arguments.number_vars[3] is VarString) { newSignal.freq = (string)(VarString)arguments.number_vars[3]; } if (arguments.string_vars.ContainsKey("pass") && arguments.string_vars["pass"] is VarString) { newSignal.pass = (string)(VarString)arguments.string_vars["pass"]; } else if (arguments.number_vars.ContainsKey(4) && arguments.number_vars[4] is VarString) { newSignal.pass = (string)(VarString)arguments.number_vars[4]; } if (arguments.string_vars.ContainsKey("ref") && arguments.string_vars["ref"] is VarString) { newSignal.reference = (string)(VarString)arguments.string_vars["ref"]; } else if (arguments.number_vars.ContainsKey(5) && arguments.number_vars[5] is VarString) { newSignal.reference = (string)(VarString)arguments.number_vars[5]; } if (arguments.string_vars.ContainsKey("verb") && arguments.string_vars["verb"] is VarString) { newSignal.verb = (string)(VarString)arguments.string_vars["verb"]; } else if (arguments.number_vars.ContainsKey(6) && arguments.number_vars[6] is VarString) { newSignal.verb = (string)(VarString)arguments.number_vars[6]; } if (arguments.string_vars.ContainsKey("language") && arguments.string_vars["language"] is VarString) { newSignal.language = (string)(VarString)arguments.string_vars["verb"]; } else if (arguments.number_vars.ContainsKey(7) && arguments.number_vars[7] is VarString) { newSignal.language = (string)(VarString)arguments.number_vars[7]; } scope.program.signals.Enqueue(newSignal); }); return(tcomm_VAR); }
public static VarList Generate(VarList globals) { VarList term_VAR = new VarList(); Dictionary <string, Var> term = term_VAR.string_vars; term["topic"] = new VarEvent(); term["set_foreground"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars.ContainsKey(1) && arguments.number_vars.ContainsKey(2)) { var red = arguments.number_vars[0]; var green = arguments.number_vars[1]; var blue = arguments.number_vars[2]; if (red is VarNumber && green is VarNumber && blue is VarNumber) { scope.program.terminal.foreground = new Color((float)((VarNumber)red).data, (float)((VarNumber)green).data, (float)((VarNumber)blue).data); } } returnTarget[returnID] = Var.nil; }); term["get_foreground"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = new VarList(scope.program.terminal.foreground.r, scope.program.terminal.foreground.g, scope.program.terminal.foreground.b); }); term["set_background"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars.ContainsKey(1) && arguments.number_vars.ContainsKey(2)) { var red = arguments.number_vars[0]; var green = arguments.number_vars[1]; var blue = arguments.number_vars[2]; if (red is VarNumber && green is VarNumber && blue is VarNumber) { scope.program.terminal.background = new Color((float)((VarNumber)red).data, (float)((VarNumber)green).data, (float)((VarNumber)blue).data); } } returnTarget[returnID] = Var.nil; }); term["get_background"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = new VarList(scope.program.terminal.background.r, scope.program.terminal.background.g, scope.program.terminal.background.b); }); term["set_cursor"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars.ContainsKey(1)) { var x = arguments.number_vars[0]; var y = arguments.number_vars[1]; if (x is VarNumber && y is VarNumber) { scope.program.terminal.cursor_x = (int)(VarNumber)x; scope.program.terminal.cursor_y = (int)(VarNumber)y; } } returnTarget[returnID] = Var.nil; }); term["set_cursor_x"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0)) { var x = arguments.number_vars[0]; if (x is VarNumber) { scope.program.terminal.cursor_x = (int)(VarNumber)x; } } returnTarget[returnID] = Var.nil; }); term["set_cursor_y"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0)) { var y = arguments.number_vars[0]; if (y is VarNumber) { scope.program.terminal.cursor_y = (int)(VarNumber)y; } } returnTarget[returnID] = Var.nil; }); term["get_cursor"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = new VarList(scope.program.terminal.cursor_x, scope.program.terminal.cursor_y); }); term["get_cursor_x"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = scope.program.terminal.cursor_x; }); term["get_cursor_y"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = scope.program.terminal.cursor_y; }); term["clear"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ scope.program.terminal.Clear(); returnTarget[returnID] = Var.nil; }); term["write"] = globals.string_vars["write"]; term["get_size"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = new VarList(scope.program.terminal.cursor_x, scope.program.terminal.cursor_y); }); term["get_width"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = scope.program.terminal.width; }); term["get_height"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = scope.program.terminal.height; }); term["set_topic"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = arguments.number_vars[4]; scope.program.terminal.SetTopic((int)(double)(VarNumber)arguments.number_vars[0], (int)(double)(VarNumber)arguments.number_vars[1], (int)(double)(VarNumber)arguments.number_vars[2], (int)(double)(VarNumber)arguments.number_vars[3], (string)(VarString)arguments.number_vars[4]); }); return(term_VAR); }
public static VarList Generate(VarList globals) { VarList math_VAR = new VarList(); Dictionary <string, Var> math = math_VAR.string_vars; math["sin"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Sin((double)(VarNumber)arguments.number_vars[0]); }); math["cos"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Cos((double)(VarNumber)arguments.number_vars[0]); }); math["tan"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Tan((double)(VarNumber)arguments.number_vars[0]); }); math["asin"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Asin((double)(VarNumber)arguments.number_vars[0]); }); math["acos"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Acos((double)(VarNumber)arguments.number_vars[0]); }); math["atan"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(1)) { returnTarget[returnID] = System.Math.Atan2((double)(VarNumber)arguments.number_vars[0], (double)(VarNumber)arguments.number_vars[1]); } else { returnTarget[returnID] = System.Math.Atan((double)(VarNumber)arguments.number_vars[0]); } }); math["floor"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(1)) { double e = System.Math.Pow(10, (double)(VarNumber)arguments.number_vars[1]); returnTarget[returnID] = System.Math.Floor(((double)(VarNumber)arguments.number_vars[0]) * e) / e; } else { returnTarget[returnID] = System.Math.Floor((double)(VarNumber)arguments.number_vars[0]); } }); math["ceil"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(1)) { double e = System.Math.Pow(10, (double)(VarNumber)arguments.number_vars[1]); returnTarget[returnID] = System.Math.Ceiling(((double)(VarNumber)arguments.number_vars[0]) * e) / e; } else { returnTarget[returnID] = System.Math.Ceiling((double)(VarNumber)arguments.number_vars[0]); } }); math["round"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(1)) { double e = System.Math.Pow(10, (double)(VarNumber)arguments.number_vars[1]); returnTarget[returnID] = System.Math.Round(((double)(VarNumber)arguments.number_vars[0]) * e) / e; } else { returnTarget[returnID] = System.Math.Round((double)(VarNumber)arguments.number_vars[0]); } }); math["max"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ State state = new State(); scope.callstack.Push(new DoLater(delegate { if (state.returns[0] is VarNumber && 0 == (double)(VarNumber)state.returns[0]) { returnTarget[returnID] = arguments.number_vars[0]; } else { returnTarget[returnID] = arguments.number_vars[1]; } })); scope.parser.Math(state.returns, 0, arguments.number_vars[0], arguments.number_vars[1], "lt"); }); math["min"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ State state = new State(); scope.callstack.Push(new DoLater(delegate { if (state.returns[0] is VarNumber && 0 != (double)(VarNumber)state.returns[0]) { returnTarget[returnID] = arguments.number_vars[0]; } else { returnTarget[returnID] = arguments.number_vars[1]; } })); scope.parser.Math(state.returns, 0, arguments.number_vars[0], arguments.number_vars[1], "lt"); }); math["clamp"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Clamp((double)(VarNumber)arguments.number_vars[0], (double)(VarNumber)arguments.number_vars[1], (double)(VarNumber)arguments.number_vars[2]); }); System.Random rng = new System.Random(); math["random"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ double v = rng.NextDouble(); if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarNumber) { double a = (double)(VarNumber)arguments.number_vars[0]; if (arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarNumber) { double b = (double)(VarNumber)arguments.number_vars[1]; returnTarget[returnID] = System.Math.Round(a + v * (b - a)); } else { returnTarget[returnID] = System.Math.Round(v * a); } } else { returnTarget[returnID] = v; } }); math["abs"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = System.Math.Abs((double)(VarNumber)arguments.number_vars[0]); }); math["deg"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = (double)(VarNumber)arguments.number_vars[0] / System.Math.PI * 180; }); math["rad"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = (double)(VarNumber)arguments.number_vars[0] / 180 * System.Math.PI; }); math["pi"] = System.Math.PI; return(math_VAR); }
public static VarList Number(VarList globals) { VarList outp = new VarList(); Dictionary <string, Var> number = outp.string_vars; number["_add[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data + right.data; }); number["_sub[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data - right.data; }); number["_mult[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data * right.data; }); number["_intdiv[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = (int)(left.data / right.data); }); number["_div[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data / right.data; }); number["_pow[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = Math.Pow(left.data, right.data); }); number["_mod[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data % right.data; }); number["_bitor[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = ((int)left) | ((int)right); }); number["_bitand[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = ((int)left) & ((int)right); }); number["_bitxor[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = ((int)left) ^ ((int)right); }); number["_bitshiftl[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = ((int)left) << ((int)right); }); number["_bitshiftr[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = ((int)left) >> ((int)right); }); number["_concat"] = GenericConcat; number["_le[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data <= right.data ? 1 : 0; }); number["_lt[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data < right.data ? 1 : 0; }); number["_ge[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data >= right.data ? 1 : 0; }); number["_gt[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data > right.data ? 1 : 0; }); number["_eq[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data == right.data ? 1 : 0; }); number["_ne[number]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; VarNumber right = (VarNumber)arguments.number_vars[1]; returnTarget[returnID] = left.data != right.data ? 1 : 0; }); number["_eq"] = ReturnZero; number["_ne"] = ReturnOne; number["_not"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; returnTarget[returnID] = left.data == 0?1:0; }); number["_unm"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; returnTarget[returnID] = -left.data; }); number["_len"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; returnTarget[returnID] = left.data; }); number["_bitnot"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarNumber left = (VarNumber)arguments.number_vars[0]; returnTarget[returnID] = ~(int)left.data; }); number["_and"] = And; number["_or"] = Or; number["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = new VarString("" + (double)(VarNumber)arguments.number_vars[0]); }); number["_tonumber"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ returnTarget[returnID] = arguments.number_vars[0]; }); return(outp); }
public static VarList List(VarList globals) { VarList outp = new VarList(); Dictionary <string, Var> list = outp.string_vars; list["_add[0]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList ls = (VarList)arguments.number_vars[0]; int max_key = 0; while (ls.number_vars.ContainsKey(max_key)) { max_key++; } ls.number_vars[max_key] = arguments.number_vars[1]; }); list["_add[1]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList ls = (VarList)arguments.number_vars[1]; int max_key = 0; while (ls.number_vars.ContainsKey(max_key)) { max_key++; } ls.number_vars[max_key] = arguments.number_vars[0]; }); list["_concat"] = GenericConcat; list["_eq[list]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList left = (VarList)arguments.number_vars[0]; VarList right = (VarList)arguments.number_vars[1]; returnTarget[returnID] = left == right ? 1 : 0; }); list["_ne[list]"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList left = (VarList)arguments.number_vars[0]; VarList right = (VarList)arguments.number_vars[1]; returnTarget[returnID] = left != right ? 1 : 0; }); list["_eq"] = ReturnZero; list["_ne"] = ReturnOne; list["_index"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ globals.string_vars["table"].Get(scope, returnTarget, returnID, arguments.number_vars[1], true, false); }); list["_len"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList left = (VarList)arguments.number_vars[0]; int i = 0; while (left.number_vars.ContainsKey(i)) { i++; } returnTarget[returnID] = i; }); list["_tonumber"] = list["_len"]; list["_and"] = And; list["_or"] = Or; list["_tostring"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ VarList ths = (VarList)arguments.number_vars[0]; string outs = "{"; string joiner = ""; int maxCounted = 0; for (int i = 0; ths.number_vars.ContainsKey(i); i++) { Var v = ths.number_vars[i]; outs += joiner; joiner = ", "; if (v is VarNumber) { outs += (double)(VarNumber)v; } else if (v is VarString) { outs += (string)(VarString)v; } else { outs += v.type; } maxCounted = i; } foreach (KeyValuePair <double, Var> kv in ths.number_vars) { if (kv.Key % 1 != 0 || kv.Key < 0 || kv.Key > maxCounted) { Var v = kv.Value; outs += joiner + kv.Key + "="; joiner = ", "; if (v is VarNumber) { outs += (double)(VarNumber)v; } else if (v is VarString) { outs += (string)(VarString)v; } else { outs += v.type; } } } foreach (KeyValuePair <string, Var> kv in ths.string_vars) { Var v = kv.Value; outs += joiner + "\"" + Regex.Escape(kv.Key) + "\"="; joiner = ", "; if (v is VarNumber) { outs += (double)(VarNumber)v; } else if (v is VarString) { outs += (string)(VarString)v; } else { outs += v.type; } } outs += "}"; returnTarget[returnID] = outs; }); return(outp); }
public static VarList Generate(VarList globals) { VarList string_VAR = new VarList(); Dictionary <string, Var> str = string_VAR.string_vars; str["sub"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(2)) { returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).Substring((int)(VarNumber)arguments.number_vars[1], (int)(VarNumber)arguments.number_vars[2]); } else { returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).Substring((int)(VarNumber)arguments.number_vars[1]); } }); str["match"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString) { string haystack = (string)(VarString)arguments.number_vars[0]; string needle = (string)(VarString)arguments.number_vars[1]; Regex matcher = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1)); try{ Match m = matcher.Match(haystack); if (m.Success) { if (m.Groups.Count == 1) { returnTarget[returnID] = m.Groups[0].Value; } else { VarList outList = new VarList(); for (int i = 0; i < m.Groups.Count; i++) { outList.string_vars[m.Groups[i].Name] = outList.number_vars[i] = m.Groups[i].Value; } returnTarget[returnID] = outList; } } }catch {} } }); str["gmatch"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString) { string haystack = (string)(VarString)arguments.number_vars[0]; string needle = (string)(VarString)arguments.number_vars[1]; Regex matcher = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1)); try{ MatchCollection M = matcher.Matches(haystack); int i = 0; returnTarget[returnID] = new VarFunction(delegate(Scope nscope, Dictionary <int, Var> nreturnTarget, int nreturnID, VarList narguments){ if (i < M.Count) { Match m = M[i]; if (m.Groups.Count == 1) { nreturnTarget[nreturnID] = m.Groups[0].Value; } else { VarList outList = new VarList(); for (int c = 0; c < m.Groups.Count; c++) { outList.string_vars[m.Groups[c].Name] = outList.number_vars[c] = m.Groups[c].Value; } nreturnTarget[nreturnID] = outList; } } else { nreturnTarget[nreturnID] = Var.nil; } i++; }); }catch {} } }); str["gsub"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString && arguments.number_vars.ContainsKey(2) && arguments.number_vars[2] is VarString) { string haystack = (string)(VarString)arguments.number_vars[0]; string needle = (string)(VarString)arguments.number_vars[1]; Regex matcher = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1)); try{ returnTarget[returnID] = matcher.Replace(haystack, (string)(VarString)arguments.number_vars[2]); }catch {} } else if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString && arguments.number_vars.ContainsKey(1) && arguments.number_vars[1] is VarString && arguments.number_vars.ContainsKey(2) && arguments.number_vars[2] is VarFunction) { string haystack = (string)(VarString)arguments.number_vars[0]; string needle = (string)(VarString)arguments.number_vars[1]; VarFunction replace_func = (VarFunction)arguments.number_vars[2]; Regex matcher = new Regex(needle, RegexOptions.None, new System.TimeSpan(0, 0, 1)); try{ MatchCollection M = matcher.Matches(haystack); string built = ""; int lastIndex = 0; int i = 0; DoLater loopfnc = null; State s_state = new State(); loopfnc = new DoLater(delegate { if (i < M.Count) { scope.callstack.Push(loopfnc); Match m = M[i]; if (i > 0) { if (s_state.returns[0] is VarString) { built += (string)(VarString)s_state.returns[0]; } } built += haystack.Substring(lastIndex, m.Index - lastIndex); lastIndex = m.Index + m.Groups[0].Length; if (m.Groups.Count == 1) { replace_func.Call(scope, s_state.returns, 0, m.Groups[0].Value); } else { VarList outList = new VarList(); for (int c = 0; c < m.Groups.Count; c++) { outList.string_vars[m.Groups[c].Name] = outList.number_vars[c] = m.Groups[c].Value; } replace_func.Call(scope, s_state.returns, 0, outList); } i++; } else { if (i > 0) { if (s_state.returns[0] is VarString) { built += (string)(VarString)s_state.returns[0]; } } built += haystack.Substring(lastIndex, haystack.Length - lastIndex); returnTarget[returnID] = built; } }); scope.callstack.Push(loopfnc); }catch {} } }); str["upper"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString) { returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).ToUpper(); } }); str["lower"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString) { returnTarget[returnID] = ((string)(VarString)arguments.number_vars[0]).ToLower(); } }); str["reverse"] = new VarFunction(delegate(Scope scope, Dictionary <int, Var> returnTarget, int returnID, VarList arguments){ if (arguments.number_vars.ContainsKey(0) && arguments.number_vars[0] is VarString) { char[] arr = ((string)(VarString)arguments.number_vars[0]).ToCharArray(); System.Array.Reverse(arr); returnTarget[returnID] = new string(arr); } }); return(string_VAR); }