using Convention.RScript.Parser; using System.Collections; using System.Diagnostics.CodeAnalysis; namespace Convention.RScript.Runner { public class ExitNamespaceRunner : IRSentenceRunner { public void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { } [return: MaybeNull] public object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { // 移除当前命名空间的变量 foreach (var local in context.CurrentLocalSpaceVariableNames.Peek()) { context.Variables.Remove(local); parser.context.Variables.Remove(local); } // 还原上层命名空间的变量 foreach (var local in context.CurrentLocalSpaceVariableNames.Peek()) { if (context.Variables.ContainsKey(local)) { parser.context.Variables[local] = context.Variables[local].data; } else { parser.context.Variables.Remove(local); } } context.CurrentLocalSpaceVariableNames.Pop(); // 弹栈 context.RuntimePointerStack.Pop(); return null; } [return: MaybeNull] public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context) { // 移除当前命名空间的变量 foreach (var local in context.CurrentLocalSpaceVariableNames.Peek()) { context.Variables.Remove(local); parser.context.Variables.Remove(local); } // 还原上层命名空间的变量 foreach (var local in context.CurrentLocalSpaceVariableNames.Peek()) { if (context.Variables.ContainsKey(local)) { parser.context.Variables[local] = context.Variables[local].data; } else { parser.context.Variables.Remove(local); } } context.CurrentLocalSpaceVariableNames.Pop(); // 弹栈 context.RuntimePointerStack.Pop(); yield break; } } }