System.Console.GetOpt
| Авторские права | (c) Sven Panne 2002-2005 |
|---|---|
| Лицензия | в стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильный |
| Переносимость | переносимый |
| Безопасный Haskell | безопасный |
| Язык | Haskell2010 |
Описание
Этот модуль предоставляет средства для разбора параметров командной строки в автономной программе. По сути, это порт библиотеки GNU getopt на Haskell.
GetOpt
getOpt :: ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String]) Исходный код
Обработать командную строку и вернуть список совпавших значений (и тех, которые не совпали). Аргументы:
- Требования к порядку (см.
ArgOrder) - Описания параметров (см.
OptDescr) - Фактические аргументы командной строки (предположительно полученные из
getArgs).
getOpt возвращает тройку, состоящую из аргументов параметров, списка аргументов, не являющихся параметрами, и списка сообщений об ошибках.
getOpt' :: ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String], [String]) Исходный код
Почти то же, что и getOpt, но возвращает четверку, состоящую из аргументов параметров, списка аргументов, не являющихся параметрами, списка нераспознанных параметров и списка сообщений об ошибках.
usageInfo :: String -> [OptDescr a] -> String Исходный код
Возвращает строку с описанием использования команды, сформированную из заголовка (первого аргумента) и параметров, описанных вторым аргументом.
data ArgOrder a Исходный код
Что делать с параметрами, следующими за аргументами, не являющимися параметрами
Конструкторы
| RequireOrder | не обрабатывать параметры после первого аргумента, не являющегося параметром |
| Permute | произвольно перемежать параметры и аргументы, не являющиеся параметрами |
| ReturnInOrder (String -> a) | оборачивать аргументы, не являющиеся параметрами, в параметры |
Экземпляры
| Functor ArgOrder Исходный код | Начиная с: base-4.7.0.0 |
Определён в System.Console.GetOpt Методыfmap :: (a -> b) -> ArgOrder a -> ArgOrder b Исходный код (<$) :: a -> ArgOrder b -> ArgOrder a Исходный код | |
data OptDescr a Исходный код
Каждый OptDescr описывает один параметр.
Аргументы Option:
- список символов коротких параметров
- список строк длинных параметров (без «--»)
- описатель аргумента
- пояснение параметра для пользователя
Экземпляры
| Functor OptDescr Исходный код | Начиная с: base-4.7.0.0 |
Определён в System.Console.GetOpt Методыfmap :: (a -> b) -> OptDescr a -> OptDescr b Исходный код (<$) :: a -> OptDescr b -> OptDescr a Исходный код | |
data ArgDescr a Исходный код
Описывает, принимает ли параметр аргумент и, если принимает, как аргумент преобразуется в значение типа a.
Конструкторы
| NoArg a | аргумент не ожидается |
| ReqArg (String -> a) String | параметр требует аргумент |
| OptArg (Maybe String -> a) String | необязательный аргумент |
Экземпляры
| 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.14.1/docs/libraries/base-4.22.0.0-66f8/System-Console-GetOpt.html