private ScriptingEnvironment Parse(string code) { ScriptingEnvironment environment = new ScriptingEnvironment(code, new ScriptingEnvironment()); environment.DefineValue("add", ScriptingValue.CreateFunction(Add, 2)); environment.DefineValue("sub", ScriptingValue.CreateFunction(Sub, 2)); return(environment); }
public void ParseSumArray() { var context = Parse( "let sum [] = 0;\r\n" + "let sum (x:xs) = add x (sum xs);\r\n" ); var sum = context["sum"]; var array = ScriptingValue.CreateArray(1, 2, 3, 4, 5); var result = sum.Invoke(array); Assert.AreEqual(15, (int)result.Value); }
public void ParseCountArray() { var context = Parse( "let count [] = 0;\r\n" + "let count (x:xs) = add 1 (count xs);\r\n" + "let main = count [1,2.2,\"3\",true,false];\r\n" ); var count = context["count"]; var array = ScriptingValue.CreateArray(1, 2, 3, 4, 5); var result = count.Invoke(array); Assert.AreEqual(5, (int)result.Value); Assert.AreEqual(5, context["main"].Value); }
public void ParseStateMonad() { var context = Parse( "let next s = create_state s (add s 1);\r\n" + "let main = do(state(continue))\r\n" + " var a = next;\r\n" + " var b = next;\r\n" + " var c = return (add a b);\r\n" + " return c;\r\n" + "end;\r\n" ); Assert.AreEqual(3, context["main"].RunStateMonad(ScriptingValue.CreateValue(1)).Value); }
public bool HandleCommand(string command, ref Exception error) { try { ScriptingValue value = scriptingEnvironment.ParseValue(command); callback.ShowMessage(value.ToString()); return(true); } catch (Exception ex) { error = ex; return(false); } }
private void buttonRun_Click(object sender, EventArgs e) { string text = textLaunch.Text; try { ScriptingValue value = env.ParseValue(text); textLaunch.Text = ""; textLaunch.Select(); textCode.Enabled = false; textLaunch.Enabled = false; buttonRun.Enabled = false; buttonClear.Enabled = false; Thread interpretorThread = new Thread(new ParameterizedThreadStart(o => Run((ScriptingValue)o))); interpretorThread.Start(value); Thread waitingThread = new Thread(() => { bool terminated = false; terminated = interpretorThread.Join(10000); if (!terminated) { interpretorThread.Abort(); } this.Invoke(new MethodInvoker(() => { if (!terminated) { callback.ShowError("10秒超时,停止脚本执行。"); } textCode.Enabled = true; textLaunch.Enabled = true; buttonRun.Enabled = true; buttonClear.Enabled = true; })); }); waitingThread.Start(); } catch (Exception ex) { callback.ShowError(ex.Message); textLaunch.SelectAll(); textLaunch.Select(); } }
private void Run(ScriptingValue value) { string result = ""; try { result = value.ToString(); } catch (Exception ex) { result = ex.Message; } Invoke(new MethodInvoker(() => { textOutput.Text += result + "\r\n"; textOutput.Select(textOutput.Text.Length, 0); textOutput.ScrollToCaret(); })); }
private void Add(JsonType type, string?name, string?description) { var parts = name?.Split('.') ?? Array.Empty <string>(); foreach (var part in parts) { PushPrefix(part); } if (prefixes.Count == 0) { return; } var path = string.Concat(prefixes.Reverse()); result[path] = new ScriptingValue(path, type, description); for (int i = 0; i < parts.Length; i++) { prefixes.Pop(); } }
public void ParseSumTree() { var context = Parse( "let sum ['leaf, n] = n;\r\n" + "let sum ['tree, m, n] = add (m :> sum) (sum n);\r\n" ); var sum = context["sum"]; var tree = ScriptingValue.CreateArray( new Flag("tree"), ScriptingValue.CreateArray( new Flag("tree"), ScriptingValue.CreateArray( new Flag("leaf"), 1 ), ScriptingValue.CreateArray( new Flag("leaf"), 2 ) ), ScriptingValue.CreateArray( new Flag("tree"), ScriptingValue.CreateArray( new Flag("leaf"), 3 ), ScriptingValue.CreateArray( new Flag("leaf"), 4 ) ) ); var result = sum.Invoke(tree); Assert.AreEqual(10, (int)result.Value); }
private ScriptingValue Sub(ScriptingValue[] arguments) { return(ScriptingValue.CreateValue((int)arguments[0].Value - (int)arguments[1].Value)); }