我有兴趣拥有与 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 开始运行之前不会调用它。