Spec-Zone.ru › Haskell 9

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 Source

С момента: base-4.7.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 Source

С момента: base-4.7.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.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.12.1/docs/libraries/base-4.21.0.0-8e62/System-Console-GetOpt.html

Spec-Zone.ru

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