библиотека параметров, такая как Google GFlags для Haskell

Мне интересно иметь что-то очень похожее на библиотеку флагов Google для Haskell.

Вот небольшое введение в gflags, которое демонстрирует, почему я люблю его: http://gflags.googlecode.com/svn/trunk/doc/gflags.html

Я просмотрел различные getopt-подобные библиотеки на Hackage и не нашел ни одной, которая соответствовала бы простоте и гибкости gflags.

А именно, я хотел бы иметь эти функции:

  • генерирует --help (со значениями по умолчанию, указанными в справке),
  • помимо синтаксического анализа параметров, предоставленных пользователем, он также должен ошибаться в несопоставленных параметрах, чтобы у пользователя была возможность отметить опечатки,
  • флаги могут быть легко объявлены в любом модуле (надеюсь, на верхнем уровне, хакерство Template Haskell приемлемо, если это необходимо),
  • нет необходимости в main вызывать все модули, где я объявил флаги, вместо этого флаги каким-то образом регистрируются при запуске/связывании/в любое время,
  • it's OK if main has to call a general initialization function, like in gflags'
    google::ParseCommandLineFlags(&argc, &argv, true);
  • флаги можно использовать чисто (да, я думаю, что это подходящее использование unsafePerformIO для упрощения API).

После безуспешных поисков я поиграл с идеей сделать это сам (и, конечно же, поделиться этим на Hackage). Однако у меня нет абсолютно никакого представления о реализации регистрационной части. Мне нужно что-то похожее на атрибут GCC ((constructor)) или на статическую инициализацию C++, но в Haskell. Стандартного unsafePerformIO верхнего уровня недостаточно, потому что это лениво, поэтому он не будет вызываться до того, как main начнет работать.


person errge    schedule 08.04.2012    source источник
comment
Какой вопрос? Как обеспечить видимость всех экземпляров объявленных флагов? Вы рассматривали класс типов?   -  person Don Stewart    schedule 09.04.2012
comment
Это не особенно хаскельский способ делать вещи. Модули Haskell, как правило, автоматически не творят чудеса, связанные с глобальным состоянием, в основном потому, что программы на Haskell на самом деле не имеют глобальное состояние. Как минимум вам понадобятся модули, чтобы иметь возможность запускать код при их импорте, и в чистом функциональном программировании для этого нет причин, опять же, потому что нет такой вещи, как состояние.   -  person Matthew Walton    schedule 10.04.2012
comment
Дон: извините за неясность вопроса. Я хотел бы знать, есть ли что-то подобное в наличии, что я не нашел. Если нет, то мне нужны идеи для реализации моего механизма регистрации флагов между модулями. Я играл с идеей использования классов типов для этого хака, меня больше всего беспокоит следующее (придуманный пример): Main импортирует ProtocolServer, ProtocolServer импортирует TCPServer, TCPServer определяет флаг tcp_soreuseaddr :: Bool. Теперь Main не увидит ни этот флаг, ни взлом TH. Вот почему я хотел бы иметь какую-то статическую инициализацию.   -  person errge    schedule 10.04.2012
comment
Мэтью: спасибо за ваш комментарий. Я знаю, что то, что я прошу, не является обычным Haskell, но библиотека Google GFlags не была обычной в своем мышлении в то время, когда стандартом был getopt. Тем не менее, если вы попробуете gflags для своего следующего проекта c/c++, вы никогда не вернетесь к getopt. Парсинг командной строки — особая вещь, где некоторые unsafePerformIO облегчают, а не усложняют жизнь. В конце концов, значения командной строки не меняются во время одного запуска программы.   -  person errge    schedule 10.04.2012
comment
Дон: извини, ты был прав. Моя проблема может быть решена с помощью классов типов, просто :info ввела меня в заблуждение. Я сообщил о своей путанице (hackage.haskell.org/trac/ghc/ticket/ 5998). Если я закончу свою реализацию с хаком класса типов, я поделюсь им здесь, спасибо за идею!   -  person errge    schedule 11.04.2012


Ответы (2)


Изучив все решения на Hackage (спасибо за все советы!), я продолжил идею реализации класса типов Дона и создал библиотеку с именем HFlags.

Это о взломе: http://hackage.haskell.org/package/hflags

У меня также есть сообщение в блоге с его описанием: http://blog.risko.hu/2012/04/ann-hflags-0.html

person errge    schedule 30.04.2012

Вам может понравиться CmdArgs, хотя я не использовал его достаточно, чтобы определить, удовлетворяет ли он всем вашим ограничениям. .

person Daniel Wagner    schedule 10.04.2012
comment
Это противоречит моим требованиям, но спасибо за указатель. - person errge; 11.04.2012