Допустим, у меня есть следующий код
let main a b c d e = Format.eprintf "%B %B %B %B %B@." a b c d e
let cmd =
let open Cmdliner in
let a = Arg.(value & flag & info ["a"] ~doc:"a") in
let b = Arg.(value & flag & info ["b"] ~doc:"b") in
let c = Arg.(value & flag & info ["c"] ~doc:"c") in
let d = Arg.(value & flag & info ["d"] ~doc:"d") in
let e = Arg.(value & flag & info ["e"] ~doc:"e") in
Term.(const main $ a $ b $ c $ d $ e), Term.(info "test" ~version:"1" ~doc:"abcde" ~exits:default_exits ~man:[])
let () = Cmdliner.Term.(exit @@ eval cmd)
Если я выполню свою программу без параметров, я получу false false false false false
, а если я использую ее с -ade
, я получу true false false true true
, что именно то, что я хотел.
Теперь предположим, что я сделал опечатку в своей функции main
и написал вместо нее
(* Notice the d before c *)
let main a b d c e = Format.eprintf "%B %B %B %B %B@." a b c d e
Если я выполню свою основную программу с -ade
, как ранее, я буду получить true false true false true
, что можно считать неправильным.
Итак, я хотел бы знать, можно ли собрать в записи параметры для использования их с собственными именами, что-то вроде следующего примера (который не не работает):
open Cmdliner
type o = {a : bool Term.t;
b : bool Term.t;
c : bool Term.t;
d : bool Term.t;
e : bool Term.t;}
(* a - e are not booleans but bool Term.t which gives an obvious error *)
let main {a; b; c; d; e} = Format.eprintf "%B %B %B %B %B@." a b c d e
let cmd =
let a = Arg.(value & flag & info ["a"] ~doc:"a") in
let b = Arg.(value & flag & info ["b"] ~doc:"b") in
let c = Arg.(value & flag & info ["c"] ~doc:"c") in
let d = Arg.(value & flag & info ["d"] ~doc:"d") in
let e = Arg.(value & flag & info ["e"] ~doc:"e") in
let o = Term.const {a; b; c; d; e} in
Term.(const main $ o), Term.(info "test" ~version:"1" ~doc:"abcde" ~exits:default_exits ~man:[])
let () = Cmdliner.Term.(exit @@ eval cmd)
Это может быть полезно в больших проектах и уменьшит количество аргументов, переданных функциям. Возможно, есть способ сделать это, но все примеры, которые я нашел, использовали первый способ. Я не хотел открывать проблему на странице GitHub, поэтому я спросил ее здесь.