2011-06-24 4 views
1

"runInteractiveCommand"を介して外部の対話型プログラムをhaskellで実行し、プログラムの出力がプログラムのプロンプトを表示するまで読む必要があります。これまでのところ私はwhileループで「HREADY」と「hGetChar」を使うべきだと思うHaskell:runInteractiveCommand:これまでの出力を無視するには?

checkConsistency cal nets = do 
    (sparqIn, sparqOut, sparqErr, sparqId) <- runInteractiveCommand "sparq -i" 
    mapM_ (flip hSetBinaryMode False) [sparqIn, sparqOut] 
    hSetBuffering sparqIn LineBuffering 
    hSetBuffering sparqOut NoBuffering 
    hPutStrLn sparqIn ("load-calculus " ++ cal) 
-- Here i need to wait for output and ignore it until the prompt is shown! 
    sparqAnswers <- mapM (checkConsistencyWithSparq sparqIn sparqOut) nets 
    return sparqAnswers 

を持っていますが、私は正確にどのように行うのかわかりません。それとももっと良い方法がありますか?

敬具、それはあなたがやりたいようで何 Annaluise

答えて

5

Parseあなたのインタラクティブなプログラムの出力です。これは非常に毛深い(出力のフォーマット、セマンティクス要件などに依存しますが)、非常にシンプルな構造を取り除くことができます。

import Control.Applicative         
import System.IO            
import System.Process  

main = do              
    (inn, out, err, idd) <- runInteractiveCommand "mongo"  
    mapM_ (flip hSetBinaryMode False) [inn, out]    
    hSetBuffering inn LineBuffering       
    hSetBuffering out NoBuffering        
    hPutStrLn inn "help"          
    parsedIntro <- parseUntilPrompt out      
    mapM_ (putStrLn . \x -> "PARSED:: " ++ x) parsedIntro 

parseUntilPrompt :: Handle -> IO [String]      
parseUntilPrompt out = do          
    latest <- hGetLine out          
    if latest == ""            
    then return []           
    else (:) <$> return latest <*> parseUntilPrompt out 

喜んで私のhelpコマンドの出力解析します:

*Interactive> main 
PARSED:: MongoDB shell version: 1.8.0          
PARSED:: connecting to: test            
PARSED:: > help               
PARSED::  db.help()     help on db methods   
PARSED::  db.mycoll.help()    help on collection methods 
PARSED::  rs.help()     help on replica set methods 
PARSED::  help connect     connecting to a db help  
PARSED::  help admin     administrative help   
PARSED::  help misc     misc things to know   
PARSED::  help mr      mapreduce help    
*Interactive>            
を次の例では、再帰的 parseUntilPrompt同様

関連する問題