System.Console.GetOpt
| Авторские права | (c) Sven Panne 2002-2005 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддерживающий | libraries@haskell.org |
| Стабильность | стабильная |
| Переносимость | переносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
Этот модуль предоставляет средства для разбора командной строки в автономной программе. Он представляет собой по существу Haskell-порт библиотеки GNU getopt.
GetOpt
getOpt :: ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String]) Source
Обработайте командную строку и верните список значений, которые соответствовали (и те, которые не соответствовали). Аргументы:
- Требования к порядку (см.
ArgOrder) - Описание опций (см.
OptDescr) - Фактические аргументы командной строки (скорее всего, полученные из
getArgs).
getOpt возвращает тройку, содержащую аргументы опций, список неопций и список сообщений об ошибках.
getOpt' :: ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String], [String]) Source
Это почти то же самое, что getOpt, но возвращает четверку, содержащую аргументы опций, список неопций, список нераспознанных опций и список сообщений об ошибках.
usageInfo :: String -> [OptDescr a] -> String Source
Возвращает строку, описывающую использование команды, полученную из заголовка (первый аргумент) и опций, описанных во втором аргументе.
Что делать с опциями, следующими за неопциями
Конструкторы
| RequireOrder | обработка опций после первой неопции запрещена |
| Permute | свободно перемешивать опции и неопции |
| ReturnInOrder (String -> a) | обрабатывать неопции как опции |
Примеры
Каждая OptDescr описывает одну опцию.
Аргументы Option:
- список коротких символов опций
- список длинных строк опций (без "--")
- описание аргумента
- объяснение опции для пользователя
Примеры
Описывает, требует ли опция аргумент и, если да, то как аргумент вводится в значение типа a.
Примеры использования
| Functor ArgDescr Исходный код | С версии: base-4.7.0.0 |
Определено в System.Console.GetOpt Методыfmap :: (a -> b) -> ArgDescr a -> ArgDescr b Исходный код (<$) :: a -> ArgDescr b -> ArgDescr a Исходный код | |
Примеры
Для наглядного иллюстрации различных структур данных, представлены варианты командной строки для (очень простого) компилятора, выполненные двумя различными способами. Разница возникает из-за того, что тип getOpt параметризован типом значений, полученных из флагов.
Интерпретация флагов как конкретных значений
Простым вариантом для типа, связанного с флагами, является определение типа Flag как алгебраического типа, представляющего возможные флаги и их аргументы:
module Opts1 where
import System.Console.GetOpt
import GHC.Internal.Data.Maybe ( fromMaybe )
data Flag
= Verbose | Version
| Input String | Output String | LibDir String
deriving Show
options :: [OptDescr Flag]
options =
[ Option ['v'] ["verbose"] (NoArg Verbose) "chatty output on stderr"
, Option ['V','?'] ["version"] (NoArg Version) "show version number"
, Option ['o'] ["output"] (OptArg outp "FILE") "output FILE"
, Option ['c'] [] (OptArg inp "FILE") "input FILE"
, Option ['L'] ["libdir"] (ReqArg LibDir "DIR") "library directory"
]
inp,outp :: Maybe String -> Flag
outp = Output . fromMaybe "stdout"
inp = Input . fromMaybe "stdin"
compilerOpts :: [String] -> IO ([Flag], [String])
compilerOpts argv =
case getOpt Permute options argv of
(o,n,[] ) -> return (o,n)
(_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Usage: ic [OPTION...] files..."
Затем остальная часть программы будет использовать созданный список флагов для определения своего поведения.
Интерпретация флагов как преобразований записи параметров
Другой подход заключается в группировке значений параметров в записи типа Options, а каждый флаг порождает функцию типа Options -> Options для преобразования этой записи.
module Opts2 where
import System.Console.GetOpt
import GHC.Internal.Data.Maybe ( fromMaybe )
data Options = Options
{ optVerbose :: Bool
, optShowVersion :: Bool
, optOutput :: Maybe FilePath
, optInput :: Maybe FilePath
, optLibDirs :: [FilePath]
} deriving Show
defaultOptions = Options
{ optVerbose = False
, optShowVersion = False
, optOutput = Nothing
, optInput = Nothing
, optLibDirs = []
}
options :: [OptDescr (Options -> Options)]
options =
[ Option ['v'] ["verbose"]
(NoArg (\ opts -> opts { optVerbose = True }))
"chatty output on stderr"
, Option ['V','?'] ["version"]
(NoArg (\ opts -> opts { optShowVersion = True }))
"show version number"
, Option ['o'] ["output"]
(OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")
"FILE")
"output FILE"
, Option ['c'] []
(OptArg ((\ f opts -> opts { optInput = Just f }) . fromMaybe "input")
"FILE")
"input FILE"
, Option ['L'] ["libdir"]
(ReqArg (\ d opts -> opts { optLibDirs = optLibDirs opts ++ [d] }) "DIR")
"library directory"
]
compilerOpts :: [String] -> IO (Options, [String])
compilerOpts argv =
case getOpt Permute options argv of
(o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)
(_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Usage: ic [OPTION...] files..."
Аналогично, каждый флаг может породить моноидальную функцию, преобразующую запись, типа Options -> IO Options (или любой другой моноид), позволяя обработке параметров выполнять действия выбранного моноида, например, выводить сообщения справки или версии, проверять существование файлов-аргументов и т. д.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.12.1/docs/libraries/base-4.21.0.0-8e62/System-Console-GetOpt.html