From e4b7dc0f559d28177ef22aed219e97733738c1e3 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Tue, 9 Dec 2025 11:17:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=87=8D=E6=96=B0=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RScriptContext.cs | 42 ++++++++++++++++++++++++++++++++++++++++++ RScriptEngine.cs | 11 ++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) 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); + } + } }