[OCaml] Argモジュールを使ってみる
OCaml標準モジュールのArgモジュールでお手軽にコマンドライン引数を解析してみます。
この記事はINIAD(東洋大学 情報連携学部) Advent Calendar 2020の記事です。
環境
OCaml 4.09.1
サンプル
次のようなコマンドライン引数を受け取るプログラムを書く例
mycmd -i 2 -s str -b
-i
オプション…引数に数字
-s
オプション…引数に文字列
-b
オプション…指定されるとtrueになる引数なしオプション
let int_value = ref 0
let string_value = ref ""
let bool_value = ref false
let spec = [
("-i", Arg.Set_int int_value, "description about -i option");
("-s", Arg.Set_string string_value, "description about -s option");
("-b", Arg.Set bool_value, "description about -b option")
]
let others = ref []
let () = Arg.parse spec (fun s -> others := List.append others [s]) "help message"
説明
オプションの設定
int
型の引数を受け取るにはArg.Set_int
の引数にint
の参照型を渡します。
Set_string of string ref
先ほどの例では-i
オプションが相当します。
string
型の引数を受け取るにはArg.Set_string
の引数にstring
の参照型を渡します。
Set_int of int ref
先ほどの例では-s
オプションが相当します。
bool
型のオプションが指定されたかを知るにはArg.Set
の引数にbool
の参照型を渡します。
Set of bool ref
先ほどの例では-b
オプションが相当します。
オプションの解析
先ほど指定したオプションをArg.parse
関数に渡してコマンドライン引数を解析します。
val parse :
(key * spec * doc) list -> anon_fun -> usage_msg -> unit
また、Arg
モジュールのparse
関数を利用すると自身で指定したオプション以外に-h
オプションが追加されヘルプテキストの表示などを自動でやってくれます。
第一引数には先ほどのオプションを("オプション名", オプション , "オプションの説明")
のタプルのリストにした上で渡します。
let spec = [
("-i", Arg.Set_int int_value, "description about -i option");
("-s", Arg.Set_string string_value, "description about -s option");
("-b", Arg.Set bool_value, "description about -b option")
]
Arg.parse
関数の第二引数は指定したオプション以外の引数が文字列として渡ってきます。
今回はothers
に全て追加しています。
let others = ref []
let () = Arg.parse spec (fun s -> others := List.append others [s]) "help message"
第三引数は-h
オプションを指定したときに表示されるテキストです。
他にもオプションの指定の仕方はあるのでより細かい内容については
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Arg.html
を見るのが早いでしょう。