OCaml - 使用Arg解析带参数的命令行选项

时间:2017-07-03 11:35:05

标签: arguments ocaml options

我想用OCaml中的参数解析命令行选项。

标准库的模块Arg似乎可以完成我需要的所有工作,并且有一些教程可以解释如何使用这个模块。

我的问题是,当缺少选项的参数时,他们似乎都会分享同样的奇怪行为。例如,使用./a.out -dthis example执行程序会产生以下输出:

./a.out: option '-d' needs an argument.
usage: ./a.out [-b] [-s string] [-d int]
  -b : set somebool to true
  -s : what follows -s sets some string
  -d : some int parameter
  -help  Display this list of options
  --help  Display this list of options
./a.out: ./a.out: option '-d' needs an argument.
usage: ./a.out [-b] [-s string] [-d int]
  -b : set somebool to true
  -s : what follows -s sets some string
  -d : some int parameter
  -help  Display this list of options
  --help  Display this list of options
.
usage: ./a.out [-b] [-s string] [-d int]
  -b : set somebool to true
  -s : what follows -s sets some string
  -d : some int parameter
  -help  Display this list of options
  --help  Display this list of options

我无法找出错误/用法信息被打印三次的原因。这也发生在我在网上找到的所有其他代码示例中。这是Arg模块中的问题,还是在这些示例中以某种方式未正确使用?

1 个答案:

答案 0 :(得分:3)

我已经设法用OCaml 4.04.2重现了这个bug,但没有用4.02.3重现,所以看起来那里会出现某种回归。

所以,你可以做的一件事是坚持使用旧版本的OCaml,但我不建议这样做。

相反,您可以使用其他标准库,例如Jane Street' Core。它有一个名为Command的模块,它允许您编写命令行界面,就像您尝试运行的那样。

此模块的详尽教程可用here

例如,以下是Rosetta使用Command

的CLI
open Core

let spec =
  let open Command.Spec in
  empty
    +> flag "-b" (no_arg) ~doc:"Sets some flag"
    +> flag "-s" (optional_with_default "" string) ~doc:"STRING Some string parameter"
    +> flag "-d" (optional_with_default 0 int) ~doc:"INTEGER Some int parameter"

let command =
  Command.basic
    ~summary:"My awesome CLI"
    spec
    (fun some_flag some_string some_int () ->
       printf " %b '%s' %d\n" some_flag some_string some_int
    )

let () =
  Command.run command

编辑:此错误已知且is going to be fixed in OCaml 4.05