Spec-Zone.ru › Haskell 7

System.Console.GetOpt

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

Содержание

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

Описание

Эта библиотека предоставляет средства для разбора параметров командной строки в автономной программе. Она представляет собой фактически перевод библиотеки 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)

оборачивает непараметрические аргументы в параметры

Примеры использования

Functor ПорядокАргументов

data ОписаниеПараметра a Исходный код

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

Аргументы Option:

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

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

Option [Символ] [Строка] (ОписаниеАргумента a) Строка

Примеры использования

Functor ОписаниеПараметра

data ОписаниеАргумента a Исходный код

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

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

NoArg a

аргумент не требуется

ReqArg (Строка -> a) Строка

для параметра требуется аргумент

OptArg (МожетБыть Строка -> a) Строка

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

Примеры использования

Functor ОписаниеАргумента

Примеры

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

Spec-Zone.ru

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