Arg

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2009-09-10 (木) 15:31:55

Chapter 20 標準ライブラリ

module Arg: sig  .. end

コマンドライン引数をパーズします。

このモジュールは、プログラムに与えられたコマンドラインオプションや引数を展開する汎用的なメカニズムを提供します。

コマンドラインの文法は以下の通りです。キーワードは - で始まる文字列です。オプションはキーワードのみのものと、引数が続くものがあります。キーワードの型には Unit 、Bool 、Set 、Clear 、String 、Set_string 、Int 、 Set_int 、 Float 、Set_float 、Tuple 、Symbol 、Rest があります。Unit 、Set 、Clear キーワードは引数をとりません。Rest キーワードはコマンドラインの残りを (文字列) 引数に取ります。それ以外のキーワードはコマンドラインで次にある語を引数に取ります。キーワードがなく引数が現れたものは、匿名引数と呼ばれます。

例 (cmd はコマンド名と仮定します) 。

  • cmd -flag (unit オプション)
  • cmd -int 1 (1 を引数に取る int オプション)
  • cmd -string foobar ("foobar" を引数に取る string オプション)
  • cmd -float 12.34 (12.34 を引数に取る float オプション)
  • cmd a b c ("a" 、"b" 、"c" の 3 つの匿名引数)
  • cmd a b -- c d (2 つの匿名引数と、2 つの引数を取る rest オプション)

type spec =
| Unit of (unit -> unit) 	(* Call the function with unit argument *)
| Bool of (bool -> bool)       (* Call the function with a bool argument *)
| Set of bool Pervasives.ref 	(* Set the reference to true *)
| Clear of bool Pervasives.ref (* Set the reference to false *)
| String of (string -> unit) 	(* Call the function with a string argument *)
| Set_string of string ref     (* Set the reference to the string argument *)	
| Int of (int -> unit) 	(* Call the function with an int argument *)
| Set_int of int ref           (* Set the reference to the int argument *)
| Float of (float -> unit) 	(* Call the function with a float argument *)
| Set_float of float ref       (* Set the reference to the float argument *)
| Tuple of spec list           (* Take several arguments according to the spec list *)
| Symbol of string list * (string -> unit)
                               (* Take one of the symbols as argument and call the
                                  function with the symbol *)
| Rest of (string -> unit) 	(* Stop interpreting keywords and call the function with
                                  each remaining argument *)

この型は各キーワードに対応する挙動を指定するのに使います。

type key = string 
type doc = string 
type usage_msg = string 
type anon_fun = string -> unit 
val parse : (string * spec * string) list -> (string -> unit) -> string -> unit

Arg.parse speclist anonfun usage_msg はコマンドラインをパースします。speclist は triple (key, spec, doc) のリストで、key はオプションのキーワード (最初の文字は '-' にしてください) です。spec はオプションの型と関数です。コマンドラインでこのオプションを指定された場合はこの関数が呼ばれます。doc はオプションの 1 行説明で、anonfun は匿名引数があったとき呼ばれる関数です。spec と anonfun の関数はコマンドラインに与えられた順に呼び出されます。

Arg.parse を実行中エラーが発生したら、以下のエラーメッセージを出力して終了します。

   * エラーの原因 (不明なオプション、無効な引数、必要な引数が見つからない、など)
   * usage_msg
   * オプションとそれの doc の一覧

&- で始まる匿名引数を指定したい方は、例えば ("-", String anonfun, doc) を speclist 中に含めるなどしてください。

parse はデフォルトで -help と --help の Unit オプションを認識し、どちらかが指定された場合 usage_msg とオプションのリストを表示して終了します。この動作は speclist 中に -help や --help を指定すれば自由に変更できます。

val parse_argv : ?current:int ref ->
      string array ->
      (key * spec * doc) list -> anon_fun -> usage_msg -> unit

Arg.parse_argv ~current args speclist anonfun usage_msg は配列 args をコマンドラインだと思ってパースします。~current の値や Arg.current は使用されたり更新されます。parse_args を呼び出す前に設定してください。~current のデフォルト値はコマンドライン配列の0番目の実行ファイル名です。Arg.parse_argv でエラーが起きると、エラーメッセージを引数にとった例外 Arg.Bad が発生し、オプションで -help か --help が設定してあれば、ヘルプメッセージを引数にとった例外 Arg.Help が発生します。

exception Help of string

Arg.parse_argv 関数内でヘルプ用の例外を発生させることができます。

exception Bad of string

spec と anonfun の関数内では例外 Arg.Bad を発生することができます。例外は無効な引数を拒否するエラーメッセージを引数にとります。

val usage : (string * spec * string) list -> string -> unit

Arg.usage speclist usage_msg はオプションのリストとエラーメッセージを出力します。これは Arg.parse でエラーが発生した場合と同じです。speclist と usage_msg は Arg.parse と同じです。

val align : (key * spec * doc) list -> (key * spec * doc) list

キーワードの長さに従って、ドキュメントの最初にスペースが入っているリストを返します。全体の文字列を並べたいのであれば、ドキュメントの最初の文字はスペースにしてください。doc は Symbol 引数に相当する次のコマンドラインを並べます。

val current : int Pervasives.ref

処理中の引数の Sys.argv 中での位置です。この値は書き換え可能です (つまり Arg.parse を強制的に指定引数までスキップさせることができます) 。

新規 編集 添付