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