2010-08-08 4 views
1

J'essaye de faire un wrapper .NET pour un REPL (spécifiquement Scheme, mais je n'ai pas obtenu où cela importe). J'ai cherché une sorte de bibliothèque expect-style, mais je ne pouvais pas en trouver un, donc j'ai utilisé un System.Diagnostics.Process. Je ne pense pas réussir à lire et à écrire correctement.Comment faire pour envelopper un REPL en utilisant .NET?

Voici mon code; il est en IronPython, mais j'ai eu des résultats similaires en 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() 

Et voici la sortie:

Welcome to Racket v5.0.1 



C:\home> 

Je pense qu'il a fini par me permettre de lire l'invite (quelque chose comme « > "), et le résultat de l'expression que j'ai entrée (" (+ 3 15) "devrait retourner" 18 ").

Répondre

2

Je trouve la réponse: je devais insérer

prc.StandardOutput.DiscardBufferedData() 

avant d'essayer de lire à nouveau. Un StreamReader tamponnera souvent plus de données que vous avez lu, et si le flux est modifié, il ne le saura pas nécessairement.

Questions connexes