如何获取 Common Lisp 中的命令行参数(特别是在 GNU 中,如果有任何差异)?
http://cl-cookbook.sourceforge.net/os.html提供了一些见解
(defun my-command-line ()
(or
#+CLISP *args*
#+SBCL *posix-argv*
#+LISPWORKS system:*line-arguments-list*
#+CMU extensions:*command-line-words*
nil))
我想这就是您正在寻找的。
我假设您正在使用 CLisp 编写脚本。您可以创建一个包含
的文件#! /usr/local/bin/clisp
(format t "~&~S~&" *args*)
通过运行使其可执行
$ chmod 755 <filename>
运行它会给出
$ ./<filename>
NIL
$ ./<filename> a b c
("a" "b" "c")
$ ./<filename> "a b c" 1 2 3
("a b c" "1" "2" "3")
您是在谈论 Clips 还是 GCL?看起来就像在 GCL 中命令行参数被传入
si::*command-args*
。
一种可移植的方式是
uiop:command-line-arguments
(在 ASDF3 中可用,在所有主要实现中默认提供)。
在库方面,有提到的 Clon 库,它为每个实现抽象了机制,现在还有更简单的 unix-opts,以及 Cookbook 上的教程。
(ql:quickload "unix-opts")
(opts:define-opts
(:name :help
:description "print this help text"
:short #\h
:long "help")
(:name :nb
:description "here we want a number argument"
:short #\n
:long "nb"
:arg-parser #'parse-integer) ;; <- takes an argument
(:name :info
:description "info"
:short #\i
:long "info"))
然后使用
(opts:get-opts)
完成实际解析,它返回两个值:选项和剩余的自由参数。
在 SBCL 中,我们可以使用
sb-ext:*posix-argv*
从 Common Lisp 脚本中获取 argv。 sb-ext:*posix-argv*
是一个包含所有参数的列表,列表的第一个成员是脚本文件名。
如https://stackoverflow.com/a/1021843/31615所示,每个实现都有自己的机制。处理这个问题的通常方法是使用一个包装库来为您提供一个统一的界面。
这样的库不仅可以提供进一步的帮助,不仅可以读取内容,还可以转换它们并向用户提供有用的输出。一个相当完整的软件包是 CLON(不要与 CLON 或 CLON 混淆,抱歉),Command Line Options Nuker,它还带来了大量的文档。不过,如果您的需求更轻量级,还有其他一些,例如 command-line-arguments 和 apply-argv。
quicklisp 中的这些包分别命名为
net.didierverna.clon
、command-line-arguments
和 apply-argv
。
只需前往 SBCL (2.1.11.debian) 即可:
(defun main ()
(let (
(args sb-ext:*posix-argv*))
(format t "args = ~a~%" args)))
(main)