4

我有兴趣拥有与 Google 的 Haskell 标志库非常相似的东西。

这是 gflags 的简短介绍,说明了我为什么喜欢它: http: //gflags.googlecode.com/svn/trunk/doc/gflags.html

我查看了 Hackage 上的各种 getopt 类库,但没有找到与 gflags 的简单性和灵活性相匹配的库。

也就是说,我想拥有这些功能:

  • 生成 --help (使用帮助中提到的默认值),
  • 除了解析用户给出的选项外,它还应该在不匹配的选项上出错,因此用户有机会注意错别字,
  • 可以在任何模块中轻松声明标志(希望在顶层,如果需要,可以接受 Template Haskell 黑客),
  • 不需要在 main 中调用我声明标志的所有模块,而是标志在启动/链接/任何时间以某种方式注册自己,
  • 如果 main 必须调用通用初始化函数,就像在 gflags 中一样,那没关系
    google::ParseCommandLineFlags(&argc, &argv, true);
  • flags 可以纯粹使用(是的,我认为这是 unsafePerformIO 的适当用法,以使 API 更简单)。

在环顾四周但没有成功之后,我想自己做这个(当然在 Hackage 上分享它)。但是,我完全不知道注册部分的实现。我需要类似于 GCC 的 ((constructor)) 属性或 C++ 的静态初始化的东西,但在 Haskell 中。标准的顶级 unsafePerformIO 是不够的,因为那是惰性的,所以在 main 开始运行之前不会调用它。

4

2 回答 2

3

在研究了关于 Hackage 的所有解决方案(感谢所有提示!)之后,我继续使用 Don 的类型类实现想法,并创建了一个名为 HFlags 的库。

它在黑客攻击:http: //hackage.haskell.org/package/hflags

我也有一篇博文,描述它:http ://blog.risko.hu/2012/04/ann-hflags-0.html

于 2012-04-30T14:16:48.847 回答
2

您可能会喜欢CmdArgs,尽管我没有充分使用它来判断它是否满足您的所有约束。

于 2012-04-10T18:39:20.620 回答