diff --git a/RScriptContext.cs b/RScriptContext.cs index 366c44e..d881fc3 100644 --- a/RScriptContext.cs +++ b/RScriptContext.cs @@ -91,6 +91,8 @@ namespace Convention.RScript Dictionary GetCurrentVariables(); void Run(ExpressionParser parser); IEnumerator RunAsync(ExpressionParser parser); + public void ReRun(ExpressionParser parser); + public IEnumerator ReRunAsync(ExpressionParser parser); SerializableClass Compile(ExpressionParser parser); SerializableClass CompileFromCurrent(ExpressionParser parser); } @@ -327,6 +329,21 @@ namespace Convention.RScript } } + private void ResetAndSureRunAgain(ExpressionParser parser) + { + StepCount = 0; + CurrentLocalSpaceVariableNames.Clear(); + RuntimePointerStack.Clear(); + GotoPointerStack.Clear(); + CurrentLocalSpaceVariableNames.Clear(); + CurrentLocalSpaceVariableNames.Push(new()); + JumpPointerCache.Clear(); + foreach (var (name, varObject) in Variables) + { + parser.context.Variables[name] = varObject.data; + } + } + private void AfterRun(ExpressionParser parser) { foreach (var (varName, varValue) in parser.context.Variables) @@ -361,6 +378,31 @@ namespace Convention.RScript AfterRun(parser); } + public void ReRun(ExpressionParser parser) + { + ResetAndSureRunAgain(parser); + for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++) + { + RunNextStep(parser); + } + AfterRun(parser); + } + + public IEnumerator ReRunAsync(ExpressionParser parser) + { + ResetAndSureRunAgain(parser); + for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++) + { + var ret = RunNextStep(parser); + if (ret is IEnumerator ir) + { + yield return ir; + } + yield return null; + } + AfterRun(parser); + } + public SerializableClass Compile(ExpressionParser parser) { BeforeRun(parser); diff --git a/RScriptEngine.cs b/RScriptEngine.cs index 46fbd22..a4a1a3f 100644 --- a/RScriptEngine.cs +++ b/RScriptEngine.cs @@ -145,7 +145,6 @@ namespace Convention.RScript context = CreateContext(SplitScript(script).ToArray(), import, variables); return context.RunAsync(parser); } - public SerializableClass Compile(string script, RScriptImportClass import = null, RScriptVariables variables = null) { parser = new(new()); @@ -173,5 +172,15 @@ namespace Convention.RScript context = CreateContext(data, import, variables); yield return context.RunAsync(parser); } + public Dictionary ReRun() + { + context.ReRun(parser); + return context.GetCurrentVariables(); + } + public IEnumerator ReRunAsync() + { + return context.ReRunAsync(parser); + } + } }