Spec-Zone.ru › Haskell 8

System.Console.GetOpt

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

Содержание

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

Описание

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

Возвращает строку, описывающую использование команды, полученную из заголовка (первый аргумент) и параметров, описанных вторым аргументом.

data ArgOrder a Source

Что делать с параметрами, следующими за необязательными аргументами

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

RequireOrder

Обработка параметров после первого необязательного аргумента не выполняется.

Permute

Свободно перемешивать параметры и необязательные аргументы.

ReturnInOrder (String -> a)

Обернуть необязательные аргументы в параметры.

Примеры
Детали примеров
Functor ArgOrder

С момента: base-4.6.0.0

Детали примера

Определено в System.Console.GetOpt

Методы

fmap :: (a -> b) -> ArgOrder a -> ArgOrder b Source

(<$) :: a -> ArgOrder b -> ArgOrder a Source

data OptDescr a Source

Каждый OptDescr описывает один параметр.

Аргументы для Option:

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

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

Option [Char] [String] (ArgDescr a) String
Примеры
Детали примера
Functor OptDescr

С момента: base-4.6.0.0

Детали примера

Определено в System.Console.GetOpt

Методы

fmap :: (a -> b) -> OptDescr a -> OptDescr b Source

(<$) :: a -> OptDescr b -> OptDescr a Source

data ArgDescr a Source

Описывает, требует ли параметр аргумент, и если да, то как аргумент вводится в значение типа a.

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

NoArg a

аргумент не ожидается

ReqArg (String -> a) String

параметр требует аргумент

OptArg (Maybe String -> a) String

необязательный аргумент

Примеры
Детали примера
Functor ArgDescr

С момента: base-4.6.0.0

Детали примера

Определено в System.Console.GetOpt

Методы

fmap :: (a -> b) -> ArgDescr a -> ArgDescr b Source

(<$) :: a -> ArgDescr b -> ArgDescr a Source

Примеры

Чтобы прояснить роль различных структур данных, вот параметры командной строки для (очень простой) компилятора, выполненные двумя различными способами. Разница возникает, потому что тип 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

Spec-Zone.ru

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