Как мне обернуть REPL с помощью .NET? - PullRequest
1 голос
/ 08 августа 2010

Я пытаюсь создать оболочку .NET для REPL (в частности, 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 Ответ

2 голосов
/ 08 августа 2010

Я нашел ответ: мне нужно было вставить

prc.StandardOutput.DiscardBufferedData()

, прежде чем я попробую прочитать снова.StreamReader часто буферизует больше данных, чем вы читаете, и если поток изменяется, он не обязательно узнает.

...