From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id KAA05388 for caml-redistribution; Thu, 15 Jan 1998 10:59:06 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id MAA07253 for ; Wed, 14 Jan 1998 12:15:05 +0100 (MET) Received: from tobago.inria.fr (tobago.inria.fr [128.93.8.21]) by concorde.inria.fr (8.8.7/8.8.5) with ESMTP id MAA16924; Wed, 14 Jan 1998 12:14:55 +0100 (MET) Received: (from doligez@localhost) by tobago.inria.fr (8.6.10/8.6.6) id MAA17828; Wed, 14 Jan 1998 12:14:54 +0100 Date: Wed, 14 Jan 1998 12:14:54 +0100 From: Damien Doligez Message-Id: <199801141114.MAA17828@tobago.inria.fr> To: tkb@access.mountain.net Subject: Re: Treating arguments that start with `-' as anonymous arguments Cc: caml-list@inria.fr Sender: weis I think this is a good idea, but I would make it a little bit more versatile. Let's define a constructor Arg.Rest of (string -> void). It causes the remaining of the command line to be sent to its argument. Your example becomes: let anon s = prerr_endline ("anon arg: " ^ s);; let speclist = [ "-a", Arg.Unit (fun () -> prerr_endline "this was -a"), "a keyword"; "--", Arg.Rest anon, "Stop interpreting keywords"; ];; Arg.parse speclist anon "usage info goes here.";; And is is also possible to distinguish between anonymous arguments and arguments following the "--". I'm including my own patch at the end of this mail. Could you please test it and tell me if it works for you ? This will be in the next release of O'Caml unless you have some objection. -- Damien =================================================================== RCS file: /net/pauillac/caml/repository/csl/stdlib/arg.mli,v retrieving revision 1.12 diff -c -r1.12 arg.mli *** arg.mli 1997/11/05 19:44:08 1.12 --- arg.mli 1998/01/14 09:31:44 *************** *** 42,47 **** --- 45,52 ---- | String of (string -> unit) (* Call the function with a string argument *) | Int of (int -> unit) (* Call the function with an int argument *) | Float of (float -> unit) (* Call the function with a float argument *) + | Rest of (string -> unit) (* Stop interpreting keywords and call the + function with each remaining argument *) (* The concrete type describing the behavior associated with a keyword. *) Index: stdlib/arg.ml =================================================================== RCS file: /net/pauillac/caml/repository/csl/stdlib/arg.ml,v retrieving revision 1.8 diff -c -r1.8 arg.ml *** arg.ml 1997/09/11 15:10:19 1.8 --- arg.ml 1998/01/14 09:36:53 *************** *** 18,23 **** --- 18,25 ---- | String of (string -> unit) (* Call the function with a string argument *) | Int of (int -> unit) (* Call the function with an int argument *) | Float of (float -> unit) (* Call the function with a float argument *) + | Rest of (string -> unit) (* Stop interpreting keywords and call the + function with each remaining argument *) exception Bad of string *************** *** 91,96 **** --- 93,103 ---- let arg = Sys.argv.(!current+1) in f (float_of_string arg); incr current; + | Rest f -> + while !current < l-1 do + f Sys.argv.(!current+1); + incr current; + done; | _ -> stop (Missing s) with Bad m -> stop (Message m); end;