Common lisp 如何在CommonLisp中可移植地解析命令行参数和标志?

Common lisp 如何在CommonLisp中可移植地解析命令行参数和标志?,common-lisp,command-line-arguments,Common Lisp,Command Line Arguments,我想在Common Lisp中获取并解析命令行参数,例如,myscript-a1-b2将允许我获取值,myscript-xyz也将起作用。如何实现可移植性(在编译器之间)?您可以试试 您可能想要:使用软件包,但如果您更喜欢从软件包中导入符号,请不要忘记免费和参数。 该库定义了一个类似于传统实用程序的getopt函数。但它还使用cli选项定义了,这有点不太清楚 第一组符号定义选项,即不存在或存在的标志 &参数之后的符号定义参数,参数后面必须跟一个值 未被识别为选项或参数的参数在绑定到&free

我想在Common Lisp中获取并解析命令行参数,例如,
myscript-a1-b2
将允许我获取值,
myscript-xyz
也将起作用。如何实现可移植性(在编译器之间)?

您可以试试

您可能想要
:使用
软件包,但如果您更喜欢从软件包中导入符号,请不要忘记
免费
参数
。 该库定义了一个类似于传统实用程序的
getopt
函数。但它还使用cli选项定义了
,这有点不太清楚

  • 第一组符号定义选项,即不存在或存在的标志
  • &参数之后的符号定义参数,参数后面必须跟一个值
    
  • 未被识别为选项或参数的参数在绑定到
    &free
例如:

(in-package :test)

(defun my-program (&rest cli-args)
  (with-cli-options (cli-args)
      (x y z &parameters a b &free other)
    (list x y z a b other))))
这里我定义了程序的入口点。在实际程序中,您只需将第一个列表保留为空,如下所示:

(with-cli-options () <bindings> <body>) 
对于声明为参数但未给出实际值的选项(或者可能是,情况不明确),请小心:

存在针对未知参数的警告:

(ignore-errors (my-program "-w"))
; WARNING: Invalid option: w
=> (NIL NIL NIL NIL NIL NIL)

有关详细信息,请参阅文档。

谢谢。这看起来很不错,我将研究这个解决方案。另外,您也计划将其作为可执行文件发布,您还可以查看uiop的
命令行参数
函数
(my-program "-xyz" "-a" "2" "-b" "3" "--" "something")
=> (T T T "2" "3" ("something"))

(my-program "-x" "-y" "-z" "-a" "2" "-b" "3" "--" "something")
=> (T T T "2" "3" ("something"))
(my-program "-a" "-b")
=> (NIL NIL NIL "-b" NIL NIL)
(ignore-errors (my-program "-w"))
; WARNING: Invalid option: w
=> (NIL NIL NIL NIL NIL NIL)