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.
Конструкторы
| NoArg a | аргумент не ожидается |
| ReqArg (String -> a) String | параметр требует аргумент |
| OptArg (Maybe String -> a) String | необязательный аргумент |
Примеры
Примеры
Чтобы прояснить роль различных структур данных, вот параметры командной строки для (очень простой) компилятора, выполненные двумя различными способами. Разница возникает, потому что тип getOpt параметризован типом значений, полученных из флагов.
Интерпретация флагов как конкретных значений
Простым выбором для типа, связанного с флагами, является определение типа Flag как алгебраического типа, представляющего возможные флаги и их аргументы:
module Opts1 where
import System.Console.GetOpt
import 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 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/8.10.2/docs/html/libraries/base-4.14.1.0/System-Console-GetOpt.html