代码之家  ›  专栏  ›  技术社区  ›  JasonFruit

如何使用.NET包装REPL?

  •  1
  • JasonFruit  · 技术社区  · 14 年前

    这是我的密码;它在IronPython中,但我在C中也有类似的结果:

    from System.Diagnostics import *
    
    def get_process(cmd):
        psi = ProcessStartInfo()
        psi.RedirectStandardOutput = True
        psi.RedirectStandardInput = True
        psi.RedirectStandardError = True
        psi.UseShellExecute = False
        psi.FileName = cmd
    
        prc = Process()
        prc.StartInfo = psi
    
        return prc
    
    def read_to_prompt(prc):
        output = ""
        while prc.StandardOutput.Peek() > 0:
            output += chr(prc.StandardOutput.Read())
        return output
    
    prc = get_process("racket.exe")
    prc.Start()
    
    print read_to_prompt(prc)
    
    prc.StandardInput.WriteLine("(+ 3 15)\n")
    prc.StandardInput.Flush()
    
    print read_to_prompt(prc)
    
    prc.Kill()
    

    Welcome to Racket v5.0.1
    
    
    
    C:\home>
    

    我希望它最终允许我阅读提示(类似于“>”),我输入的表达式(“(+315)”的结果应该返回“18”)。

    1 回复  |  直到 14 年前
        1
  •  2
  •   JasonFruit    14 年前

    我找到了答案:我需要插入

    prc.StandardOutput.DiscardBufferedData()
    

    在我再次阅读之前。StreamReader通常会缓冲比您读取的数据更多的数据,如果流被更改,它就不一定知道。