arg: parsing of command line arguments

This module provides a general mechanism for extracting options and arguments from the command line to the program.
Syntax of command lines: A keyword is a character string starting with a -. An option is a keyword alone or followed by an argument. There are four types of keywords: Unit, String, Int, and Float. Unit keywords do not take an argument. String, Int, and Float keywords take the following word on the command line as an argument. Arguments not preceded by a keyword are called anonymous arguments.
Examples (cmd is assumed to be the command name):
cmd -flag (a unit option)
cmd -int 1 (an int option with argument 1)
cmd -string foobar (a string option with argument "foobar")
cmd -float 12.34 (a float option with argument 12.34)
cmd 1 2 3 (three anonymous arguments: "1", "2", and "3")
cmd 1 2 -flag 3 -string bar 4
(four anonymous arguments, a unit option, and
a string option with argument "bar")

type spec =
  String of (string -> unit)
| Int of (int -> unit)
| Unit of (unit -> unit)
| Float of (float -> unit)

The concrete type describing the behavior associated with a keyword.

value parse : (string * spec) list -> (string -> unit) -> unit

parse speclist anonfun parses the command line, calling the functions in speclist whenever appropriate, and anonfun on anonymous arguments. The functions are called in the same order as they appear on the command line. The strings in the (string * spec) list are keywords and must start with a -, else they are ignored. For the user to be able to specify anonymous arguments starting with a -, include for example ("--", String anonfun) in speclist.

exception Bad of string

Functions in speclist or anonfun can raise Bad with an error message to reject invalid arguments.