2011-12-08 43 views
7

我已經使用了庫標準和cmdargs。標準庫拾取的命令行選項

當我在沒有cmdargs的情況下完全編譯程序並運行它時,例如./prog --help然後我得到一些關於可能的選項和運行次數等標準的不希望的迴應。

當我編譯並運行它時,命令行選項首先被我的代碼拾取,然後然後按標準閱讀。然後標準報告和錯誤告訴我,選項 - 字節是未知的。我在標準文檔中沒有看到關於如何關閉或解決此問題的任何內容。有沒有辦法清除我讀過的命令行選項?否則,我需要使用例如CPUTime而不是標準,這對我來說確實很好,因爲我確實需要大量額外的功能和標準提供的數據。

{-# 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)] 

回答

11

使用System.Environment.withArgs。與cmdArgs首先是解析命令行參數,然後通過你還沒有使用到criterion什麼:

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

恐怕我不明白如何將它應用到我的代碼片段中。 –

+0

@JFritsch好的,我只是看了一下cmdargs文檔,如果我把它們正確地放在正確的位置,你就必須爲你的類型添加一個字段('Strlen')並用'args'在那裏收集它們。但是,我不確定cmdargs會使用未知選項做什麼,這是標準參數。如果你想要標準使用默認設置,'withArgs [] $ defaultMain ...'很簡單並且可以工作。如果你想傳遞固定的參數到標準,'withArgs [「-s」,「200」]例如 –

+0

當然,如果我導入System.Environment(withArgs)。我想知道是否有更優雅的東西來保持最終的二元精益。 –

3

看一看的criterion source。你應該可以編寫你自己的defaultMainWith函數來處理參數,不管你想要什麼,包括忽略它們,或者忽略未知的參數,或者等等......