如何使用.NET包装REPL?

时间:2010-08-08 11:34:35

标签: .net command-line scheme wrapper expect

我正在尝试为REPL创建一个.NET包装器(特别是Scheme,但我没有到达重要的地方)。我找了一些期待式的库,但我找不到一个,所以我一直在使用System.Diagnostics.Process。我不认为我在阅读和写作方面取得了成功。

这是我的代码;它在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>

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

1 个答案:

答案 0 :(得分:2)

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

prc.StandardOutput.DiscardBufferedData()
在我再次尝试阅读之前

StreamReader通常会缓冲比您读取的数据更多的数据,如果更改了流,则不一定知道。