OcamlでCLIツールを作りたい
OcamlでCLIを作りたくなったのでその過程をまとめる
パッケージ
あるにはあるけど微妙に古いので、サポートがしっかりしていそうな公式のモジュールArgを使う
大まかな流れとしては、
- 引数を格納したい変数を予め宣言しておく。この変数は破壊的な代入が行われるので
ref
を用いて宣言する。 - 次に、
speclist
と呼ばれる配列で引数を定義する。後で説明する。 Arg.parse
で引数をパースする。戻り値が無いことに注意。- 最初に宣言した変数を
!
を付けて値を取り出す。
speclist
OcamlのArgモジュールでは、受け付けるコマンドライン引数をspeclistという形式で宣言する。 speclistは
のように、
[(オプション, 受け付ける値の型 受け取る変数名, 説明);]
という形式で宣言する。
匿名関数
Arg.parse
は匿名関数を引数として受け付ける。この匿名関数は、コマンドラインで匿名引数が指定された際に呼び出される。
匿名引数というのは、cmd -o option
ではなくcmd option
の様に、そのままの状態でコマンドに与えられる引数を指す。
サブコマンドと言うのが一番近いかもしれない。実際、関数が呼び出されるのでサブコマンドのような挙動を実装するのも想定されている気がする。
ただし、ArgモジュールはArg.parse_dynamic
という動的に引数の解析を行う関数を提供しているので、そちらを使ったほうが良い。
この関数はspeclist
が参照型(先述したref)である事を除いて引数・戻り値はArg.parse
関数と同じになっている。
サンプル
公式のArgにあるサンプルコードを一部改変したもの。