2011-12-08 8 views
7

Ho usato il criterio delle librerie e cmdargs.Opzioni riga di comando selezionate dalla libreria criteri

Quando compilo il programma completamente senza cmdargs ed eseguo ad es. ./prog --help quindi ricevo una risposta indesiderata dal criterio sulle opzioni possibili e il numero di esecuzioni ecc.

Quando lo compilo ed eseguo come sotto la riga di comando le opzioni vengono prima rilevate dal mio codice quindi quindi leggi per criterio. Il criterio quindi riporta successivamente e l'errore mi dice che l'opzione --byte è sconosciuta. Non ho visto nulla nella documentazione dei criteri su come questo potrebbe essere spento o aggirato. C'è un modo per cancellare le opzioni della riga di comando di averlo letto? Altrimenti avrei bisogno di usare per es. CPUTime invece di criterio, per me va bene dal momento che ho bisogno di un sacco di funzionalità e dati extra forniti dal criterio.

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE DeriveDataTypeable #-} 

import System.Console.CmdArgs 

data Strlen = Strlen {byte :: Int} deriving (Data, Typeable, Show) 

strlen = cmdArgsMode $ Strlen {byte = def} &= summary "MessagePack benchmark v0.04" 

main = do 
    n <- cmdArgsRun strlen 
    let datastring = take (byte n) $ randomRs ('a','z') (mkStdGen 3) 
    putStrLn "Starting..." 
    conn <- connect "192.168.35.62" 8081 
    defaultMain [bench "sendReceive" $ whnfIO (mywl conn datastring)] 

risposta

11

Utilizzare System.Environment.withArgs. Analizzare gli argomenti della riga di comando prima con cmdArgs, allora passa quello che non hai usato per criterion:

main = do 
    (flags, remaining) <- parseArgsHowever 
    act according to flags 
    withArgs remaining $ 
     defaultMain [ ... ] 
+0

Ho paura di non capire come applicare questo al mio frammento di codice. –

+0

@JFritsch Ok, ho appena visto i documenti di cmdargs, se li capisco bene, dovresti aggiungere un campo per altri argomenti al tuo tipo ('Strlen') e collezionarli lì con' args'. Tuttavia, non sono sicuro di ciò che fa cmdargs con le opzioni sconosciute, quali sarebbero gli argomenti dei criteri. Se vuoi che il criterio usi solo le impostazioni predefinite, 'withArgs [] $ defaultMain ...' è semplice e funziona. Se vuoi passare gli argomenti fissi al criterio, 'withArgs [" -s "," 200 "]' ad es. –

+0

Funziona ovviamente se importare System.Environment (withArgs). Mi chiedo se c'è qualcosa di più elegante che mantiene la magra binario risultante. –

3

Date un'occhiata al criterion source. Dovresti essere in grado di scrivere la tua funzione defaultMainWith che gestisce gli argomenti come vuoi, compreso ignorarli o ignorare argomenti sconosciuti o ecc ...