如何在 Common Lisp 中获取命令行参数(特别是在 GNU 中,如果有任何差异)?
6 回答
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")
你说的是 Clisp 还是 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* 从通用 lisp 脚本中获取 argv。sb-ext:*posix-argv* 是一个包含所有参数的列表,第一个参数是脚本文件名。
如https://stackoverflow.com/a/1021843/31615所示,每个实现都有自己的机制。处理这个问题的常用方法是使用一个为您提供统一接口的包装库。
这样的库不仅可以在读取内容方面提供进一步的帮助,还可以在转换它们并向用户提供有用的输出方面提供帮助。一个非常完整的包是 CLON(请不要与 CLON 或 CLON 混淆,抱歉),命令行选项 Nuker,它还带来了大量的文档。但是,如果您的需求更轻量级,还有其他一些,例如command-line-arguments和apply-argv。
quicklisp 中的包分别命名为net.didierverna.clon
、command-line-arguments
和apply-argv
。