* [Caml-list] Using common arguments with Command module of the Core library @ 2015-08-03 12:18 leowzukw 2015-08-03 16:53 ` Ben Millwood 0 siblings, 1 reply; 3+ messages in thread From: leowzukw @ 2015-08-03 12:18 UTC (permalink / raw) To: caml-list [-- Attachment #1.1: Type: text/plain, Size: 1194 bytes --] Hello everybody, I'm trying to use subcommands with the Core library. I would like to factorize several things : * A set of common arguments (to set color, verbosity and so on) * A common way to deal with these arguments * A pretty way to define subcommands using these common arguments and way to handle it. Main problem is that I can't define more arguments to my subcommand. More details in my code, which is joined. You may also find it here (Github gist, could be updated): http://j.mp/1JHlZ6S [1] Result of the compilation (corebuild cmd.byte) + ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o cmd.cmo cmd.ml File "cmd.ml", line 98, characters 5-44: Warning 48: implicit elimination of optional argument ?extend File "cmd.ml", line 49, characters 11-341: Warning 27: unused variable summary. File "cmd.ml", line 49, characters 20-341: Warning 27: unused variable args. Finished, 3 targets (0 cached) in 00:00:03. Thanks for your help Leo Links: ------ [1] http://j.mp/1JHlZ6S [-- Attachment #1.2: Type: text/html, Size: 2464 bytes --] [-- Attachment #2: cmd.ml --] [-- Type: text/plain, Size: 2525 bytes --] (* Build with: * corebuild cmd.byte *) open Core.Std;; (* With this code, we are trying to * Define a common set of arguments to be passed to all sub commands * Handle these common arguments all the same way * Define sub commands in a common, less verbose way *) (* The program compiled could be used this way * cmd.byte sum 32 + 10 # Display 42 * cmd.byte settings # Display all the settings * But we could use common arguments : * cmd.byte sum -c 32 + 10 # Display 42 and a message about color * cmd.byte settings # Display all the settings * *) (* Problems: * Arguments from other commands are not passed to the functions * Several XXX below *) (* Verbosity *) let verb = ref 0;; let color = ref false;; (* A set of common flags *) let common = let open Command.Spec in empty +> flag "-v" (optional_with_default 0 int) ~doc:"n Set verbosity" +> flag "-c" (optional_with_default false bool) ~doc:"bool Set color" +> flag "--rc" (optional_with_default "" string) ~doc:"name Set configuration file" ;; (* Treating common args *) let parse_common ~f = fun verbosity col rc -> verb := verbosity; color := col; f ~rc ;; (* Common way to define subcommands *) let sub ~f ~summary ~args name = let open Command in let def = basic ~summary:"" Spec.(common +> args) (* XXX Couldn't set set summary with the argument ~summary of sub function. Error is This expression has type t -> bytes but an expression was expected of type bytes*) (parse_common ~f) in ( name, def ) ;; (* Two sub commands *) (* Display the sum of the arguments *) let sum = sub ~f:(fun ~rc _ () -> (* XXX Strange arguments passed here *) (* We would like to get the numbers passed in arguments ("first number" * and "second number" below) *) (); (* Some code to use common arguments *) if !color then printf "Colored\n" else print_endline rc) ~args:(Command.Spec.( empty +> anon ("first number" %: int) +> anon ("second number" %: int) )) ~summary:"Sum" "sum" ;; (* Print some settings and a number passed to the program *) let settings = sub ~f:(fun ~rc _ () -> printf "Settings\n"; printf "Rc: %s" rc; printf "Color: %b" !color) ~args:(let open Command.Spec in empty ) ~summary:"Display settings" "settings" ;; let () = let open Command in group ~summary:"A program to test" [ sum ; settings ] |> run ~version:"" ~build_info:"" ~argv:[] ;; ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Caml-list] Using common arguments with Command module of the Core library 2015-08-03 12:18 [Caml-list] Using common arguments with Command module of the Core library leowzukw @ 2015-08-03 16:53 ` Ben Millwood [not found] ` <05d254b1bbdff3c0030bcc8b85e1c951@vmail.me> 0 siblings, 1 reply; 3+ messages in thread From: Ben Millwood @ 2015-08-03 16:53 UTC (permalink / raw) To: leowzukw; +Cc: caml users [-- Attachment #1: Type: text/plain, Size: 2184 bytes --] There are a few ways of doing this. The newly-added Applicative interface is worth showing off: let shared_params = let open Command.Param in return (fun v c rcfile -> verb := v; color := c; rcfile) <*> flag "-v" (optional_with_default 0 int) ~doc:"..." <*> flag "-c" (...) ~doc:"..." <*> ... shared_params is now a package of arguments that sets the verb and color refs and then gives you the rcfile (it's only that way to mirror your code; I'd usually prefer to just put all three in a record or something). You can use it in Command.basic as follows: let sum = Command.basic ~summary:"whatever" Command.Spec.( empty +> shared_params +> anon ...) (fun rc ... () -> ...) let main () = Command.run begin Command.group ~summary:"some stuff" [ "sum", sum ; "settings", ... ] end Let me know if I've omitted too much :) On 3 August 2015 at 13:18, <leowzukw@vmail.me> wrote: > Hello everybody, > > I'm trying to use subcommands with the Core library. I would like to > factorize several things : > > - A set of common arguments (to set color, verbosity and so on) > - A common way to deal with these arguments > - A pretty way to define subcommands using these common arguments and > way to handle it. > > > > Main problem is that I can't define more arguments to my subcommand. More > details in my code, which is joined. You may also find it here (Github > gist, could be updated): http://j.mp/1JHlZ6S > > > > Result of the compilation (corebuild cmd.byte) > > > + ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g > -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax > -package > sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax > -package core -o cmd.cmo cmd.ml > File "cmd.ml", line 98, characters 5-44: > Warning 48: implicit elimination of optional argument ?extend > File "cmd.ml", line 49, characters 11-341: > Warning 27: unused variable summary. > File "cmd.ml", line 49, characters 20-341: > Warning 27: unused variable args. > Finished, 3 targets (0 cached) in 00:00:03. > > > Thanks for your help > Leo > > [-- Attachment #2: Type: text/html, Size: 4322 bytes --] ^ permalink raw reply [flat|nested] 3+ messages in thread
[parent not found: <05d254b1bbdff3c0030bcc8b85e1c951@vmail.me>]
[parent not found: <CA+MHO52qGd9CEwwq7pWGQDr9b0r=7niLUBk2qT0yOkSaNRCvSw@mail.gmail.com>]
* Re: [Caml-list] Using common arguments with Command module of the Core library [not found] ` <CA+MHO52qGd9CEwwq7pWGQDr9b0r=7niLUBk2qT0yOkSaNRCvSw@mail.gmail.com> @ 2015-08-04 17:25 ` leowzukw 0 siblings, 0 replies; 3+ messages in thread From: leowzukw @ 2015-08-04 17:25 UTC (permalink / raw) To: Ben Millwood; +Cc: caml-list [-- Attachment #1.1: Type: text/plain, Size: 3297 bytes --] I installed 112.35.01 and now it works perfectly, both the installation and your solution. I join the working code for mailing list. I also updated the gist. Thanks a lot for your help Leo Le 2015-08-04 10:34, Ben Millwood a écrit : > Make sure you are installing core 112.35.01, not 112.35.00. I believe it contains a fix for the issue you're seeing. If it doesn't, let me know and I'll look into it a little more. > > On 3 August 2015 at 19:54, <leowzukw@vmail.me> wrote: > > Thanks for your quick answer. It seems clear enough. > > Unfortunately, I can't install latest version of core, I get this error > > # File "src/iobuf.ml [1]", line 624, characters 17-28: > # Integer literal exceeds the range of representable integers of type int > > I think it's because of my 32bit computer. I will keep your solution in mind until I could get the latest version of core. > > Leo > > PS: Should I report an issue on Github for that ? In opam or core repository ? > > Le 2015-08-03 18:53, Ben Millwood a écrit : > There are a few ways of doing this. The newly-added Applicative interface is worth showing off: > > let shared_params = > let open Command.Param in > return (fun v c rcfile -> > verb := v; > color := c; > rcfile) > <*> flag "-v" (optional_with_default 0 int) ~doc:"..." > <*> flag "-c" (...) ~doc:"..." > <*> ... > > shared_params is now a package of arguments that sets the verb and color refs and then gives you the rcfile (it's only that way to mirror your code; I'd usually prefer to just put all three in a record or something). You can use it in Command.basic as follows: > > let sum = > Command.basic > ~summary:"whatever" > Command.Spec.( > empty > +> shared_params > +> anon ...) > (fun rc ... () -> ...) > > let main () = > Command.run begin > Command.group ~summary:"some stuff" > [ "sum", sum > ; "settings", ... > ] > end > > Let me know if I've omitted too much :) > > On 3 August 2015 at 13:18, <leowzukw@vmail.me> wrote: > > Hello everybody, > > I'm trying to use subcommands with the Core library. I would like to factorize several things : > > * A set of common arguments (to set color, verbosity and so on) > * A common way to deal with these arguments > * A pretty way to define subcommands using these common arguments and way to handle it. > > Main problem is that I can't define more arguments to my subcommand. More details in my code, which is joined. You may also find it here (Github gist, could be updated): http://j.mp/1JHlZ6S [2] > > Result of the compilation (corebuild cmd.byte) > > + ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g -bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax -package sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax -package core -o cmd.cmo cmd.ml [3] > File "cmd.ml [3]", line 98, characters 5-44: > Warning 48: implicit elimination of optional argument ?extend > File "cmd.ml [3]", line 49, characters 11-341: > Warning 27: unused variable summary. > File "cmd.ml [3]", line 49, characters 20-341: > Warning 27: unused variable args. > Finished, 3 targets (0 cached) in 00:00:03. > > Thanks for your help > Leo Links: ------ [1] http://iobuf.ml [2] http://j.mp/1JHlZ6S [3] http://cmd.ml [-- Attachment #1.2: Type: text/html, Size: 6843 bytes --] [-- Attachment #2: cmd.ml --] [-- Type: text/plain, Size: 2205 bytes --] (* Build with: * corebuild cmd.byte *) open Core.Std;; (* With this code, we are trying to * Define a common set of arguments to be passed to all sub commands * Handle these common arguments all the same way * Define sub commands in a common, less verbose way *) (* The program compiled could be used this way * cmd.byte sum 32 + 10 # Display 42 * cmd.byte settings # Display all the settings * But we could use common arguments : * cmd.byte sum -c true 32 + 10 # Display 42 and a message about color * cmd.byte settings # Display all the settings * *) (* Verbosity *) let verb = ref 0;; let color = ref false;; (* A set of common flags *) let shared_params = let open Command.Param in return (fun v c rc -> verb := v; color := c; rc) <*> flag "-v" (optional_with_default 0 int) ~doc:"n Set verbosity" <*> flag "-c" (optional_with_default false bool) ~doc:"bool Set color" <*> flag "--rc" (optional_with_default "" string) ~doc:"name Set configuration file" ;; (* Two sub commands *) (* Display the sum of the arguments *) let sum = ( "sum" , Command.basic ~summary:"" Command.Spec.( empty +> shared_params +> anon ("first_number" %: int) +> anon ("second_number" %: int) ) (fun rc a b () -> (* XXX Strange arguments passed here *) (* We would like to get the numbers passed in arguments ("first * number" * and "second number" below) *) a + b |> printf "%i\n"; (* Some code to use common arguments *) if !color then printf "Colored\n" else print_endline rc) ) ;; (* Print some settings and a number passed to the program *) let settings = ( "settings" , Command.basic ~summary:"Display settings" Command.Spec.( empty +> shared_params +> anon (maybe ("a number" %: int)) ) (fun rc n () -> printf "n: %i\n" (Option.value ~default:0 n); printf "\nSettings\n"; printf "Rc: %s\n" rc; printf "Color: %b\n" !color) ) ;; let () = let open Command in run begin group ~summary:"A program to test" [ sum ; settings ] end ;; ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-08-04 17:23 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-08-03 12:18 [Caml-list] Using common arguments with Command module of the Core library leowzukw 2015-08-03 16:53 ` Ben Millwood [not found] ` <05d254b1bbdff3c0030bcc8b85e1c951@vmail.me> [not found] ` <CA+MHO52qGd9CEwwq7pWGQDr9b0r=7niLUBk2qT0yOkSaNRCvSw@mail.gmail.com> 2015-08-04 17:25 ` leowzukw
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox