2017-07-03 11 views
2

OCamlの引数を使ってコマンドラインオプションを解析したい。OCaml - Argを使った引数付きコマンドラインオプションの解析

標準ライブラリのモジュールArgは私が必要とするすべてを行うようですが、このモジュールの使い方を説明するチュートリアルがあります。

私の問題は、オプションの引数がない場合、すべて同じ奇妙な振る舞いを共有しているようです。例えば、./a.out -dthis exampleからプログラムを実行すると、次の出力を生成する:

./a.out: option '-d' needs an argument. 
usage: ./a.out [-b] [-s string] [-d int] 
    -b : set somebool to true 
    -s : what follows -s sets some string 
    -d : some int parameter 
    -help Display this list of options 
    --help Display this list of options 
./a.out: ./a.out: option '-d' needs an argument. 
usage: ./a.out [-b] [-s string] [-d int] 
    -b : set somebool to true 
    -s : what follows -s sets some string 
    -d : some int parameter 
    -help Display this list of options 
    --help Display this list of options 
. 
usage: ./a.out [-b] [-s string] [-d int] 
    -b : set somebool to true 
    -s : what follows -s sets some string 
    -d : some int parameter 
    -help Display this list of options 
    --help Display this list of options 

Iエラー/使用方法のメッセージを3回印刷された理由を知ることができませんでした。これは私がオンラインで見つけた他のすべてのコード例にも起こります。これはArgモジュールの問題ですか、またはこれらの例で何らかの形で正しく使用されていませんか?

+0

コンパイラのどのバージョンを使用していますか? (私は今のところ4.04.2の下で再現することができました) – RichouHunter

+0

OCaml 4.02.3で動作しても、この動作は起こりません。この問題が以前に報告されたかどうかを確認するには、[OCaml bug-tracker](https://caml.inria.fr/mantis/view_all_bug_page.php)をチェックすることをお勧めします。 :) – RichouHunter

答えて

3

私はOCaml 4.04.2でバグを再現できましたが、4.02.3ではバグを再現できませんでしたので、何らかの回帰が起こっているようです。

あなたができることの1つは古いバージョンのOCamlを使うことですが、私はそれをお勧めしません。

代わりに、Jane StreetのCoreなどの代替標準ライブラリを使用できます。 Commandというモジュールがあり、実行しようとしているのと同じようにコマンドラインインターフェイスを書くことができます。

このモジュールの詳細なチュートリアルはhereです。

open Core 

let spec = 
    let open Command.Spec in 
    empty 
    +> flag "-b" (no_arg) ~doc:"Sets some flag" 
    +> flag "-s" (optional_with_default "" string) ~doc:"STRING Some string parameter" 
    +> flag "-d" (optional_with_default 0 int) ~doc:"INTEGER Some int parameter" 

let command = 
    Command.basic 
    ~summary:"My awesome CLI" 
    spec 
    (fun some_flag some_string some_int() -> 
     printf " %b '%s' %d\n" some_flag some_string some_int 
    ) 

let() = 
    Command.run command 

EDIT:例として

は、ここCommandを使用してロゼッタからCLIでこのバグは知られており、is going to be fixed in OCaml 4.05ました。

+0

私はopamにはあまり経験はありませんが、 'opam install core'のようにパッケージのzarithを1.4.1にダウングレードする必要があります。残念ながら、私のプロジェクトはザリス1.5に依存しています。 'getopt'や' getopts'のような他のコマンドラインパッケージは古いバージョンのzarithにも依存しているようです。 お返事ありがとうございます。私は、同じパッケージの複数のバージョンを持つと、すべてがもっと複​​雑になり、OCaml 4.05を待つことになります。代わりに。 – tomatenbrei

+0

ちょっと考えました: 'core'をインストールする前に' opam update'を実行しましたか? – RichouHunter

+0

いいえ、しかし 'opam update'は悲しいことに、必要なバージョンのzarithを変更しませんでした。 – tomatenbrei

関連する問題