Google の Haskell 用フラグ ライブラリに非常に似たものを用意することに興味があります。
以下は、私が gflags を気に入っている理由を示す、gflags の簡単な紹介です: http://gflags.googlecode.com/svn/trunk/doc/gflags.html
Hackage のさまざまな getopt のようなライブラリを調べましたが、gflags のシンプルさと柔軟性に一致するものは見つかりませんでした。
つまり、次の機能が必要です。
- --help を生成します (ヘルプに記載されているデフォルト値を使用)。
- ユーザーが指定したオプションを解析するだけでなく、一致しないオプションでもエラーが発生する必要があるため、ユーザーはタイプミスに気付く機会があります。
- フラグは任意のモジュールで簡単に宣言できます (できればトップレベルで、必要に応じてテンプレート Haskell ハッカーを受け入れます)。
- 主に、フラグを宣言したすべてのモジュールを呼び出す必要はありません。代わりに、フラグは起動時/リンク時/いつでも登録されます。
- gflags のように、main が一般的な初期化関数を呼び出さなければならない場合は問題ありません。
google::ParseCommandLineFlags(&argc, &argv, true);
- flags は純粋に使用できます (ええ、これは API をより単純にするための unsafePerformIO の適切な使用法だと思います)。
うまくいかなかった後、私はこれを自分でやろうというアイデアを試してみました (もちろん、Hackage で共有しました)。ただし、登録部分の実装についてはまったくわかりません。GCC の ((constructor)) 属性または C++ の静的初期化に似たものが必要ですが、Haskell です。標準の最上位の unsafePerformIO は十分ではありません。これは遅延であるため、メインの実行が開始される前に呼び出されません。