В настоящее время я работаю над REPL для языка, который использует C # в качестве промежуточного языка, и после того, как несколько раз терялся, решил, что лучше будет на практике создать REPL для C # вручную.Он использует Microsoft.CodeAnalysis.CSharp.Scripting
для запуска такого кода.Самое близкое, что я мог бы заставить его работать правильно:
const string prompt = "C# > ";
Script script = CSharpScript.Create("");
while (true)
{
Console.Write(prompt);
string input = Console.ReadLine();
SyntaxTree tree = CSharpSyntaxTree.ParseText(input);
script = script.ContinueWith(tree.GetRoot().NormalizeWhitespace().GetText().ToString());
Task<ScriptState> t = script.RunAsync();
t.Wait();
Console.WriteLine(t.Result);
}
(Да, я знаю, что while(true)
- плохая идея, но это только тестирование.) Этот код почти работает, но что-то не так: он выполняет весь код каждый раз.Поэтому вызов Console.WriteLine()
на самом деле будет писать текст каждый раз.Как я могу избежать этого поведения?