我目前正在为使用C#作为中间语言的语言编写REPL,并且在迷失了几次之后,决定最好在实践中为C#手动创建REPL。它使用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()
都会写文本。如何避免这种行为?