Spec-Zone.ru › Haskell 9

System.Console.GetOpt

Авторские права (c) Sven Panne 2002-2005
Лицензия в стиле BSD (см. файл libraries/base/LICENSE)
Сопровождающий libraries@haskell.org
Стабильность стабильный
Переносимость переносимый
Безопасный Haskell безопасный
Язык Haskell2010

Содержание

  • GetOpt
  • Примеры
    • Интерпретация флагов как конкретных значений
    • Интерпретация флагов как преобразований записи параметров

Описание

Этот модуль предоставляет средства для разбора параметров командной строки в автономной программе. По сути, это порт библиотеки 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:

  • список символов коротких параметров
  • список строк длинных параметров (без «--»)
  • описатель аргумента
  • пояснение параметра для пользователя

Конструкторы

Option [Char] [String] (ArgDescr a) String
Экземпляры
Сведения об экземплярах
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API