[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

を見るのが早いでしょう。