2010-08-08 55 views
1

我正在嘗試爲REPL製作一個.NET包裝器(具體來說,Scheme,但我沒有注意它的重要性)。我尋找某種期待式庫,但我找不到一個庫,所以我一直在使用System.Diagnostics.Process。我認爲我沒有成功地閱讀和寫作。如何使用.NET打包REPL?

這是我的代碼;它在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「)。

回答

2

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

prc.StandardOutput.DiscardBufferedData() 

我再試試讀數。 StreamReader通常會緩存比您讀取的數據更多的數據,如果數據流發生更改,則不一定知道。