22

如何在 Common Lisp 中获取命令行参数(特别是在 GNU 中,如果有任何差异)?

4

6 回答 6

26

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))

是你要找的,我想。

于 2009-06-20T15:25:46.983 回答
19

我假设您正在使用 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")
于 2009-06-20T16:08:57.053 回答
4

你说的是 Clisp 还是 GCL?似乎在 GCL 中,命令行参数传入si::*command-args*.

于 2009-06-20T17:23:09.313 回答
3

一种可移植的方式是uiop:command-line-arguments(在 ASDF3 中可用,默认情况下在所有主要实现中提供)。

库方面,有提到的为每个实现抽象机制的 Clon 库,现在还有更简单的unix-optsCookbook 上的教程

(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),它返回两个值:选项和剩余的自由参数。

于 2018-06-19T15:27:34.137 回答
2

在 SBCL 中,我们可以使用 sb-ext:*posix-argv* 从通用 lisp 脚本中获取 argv。sb-ext:*posix-argv* 是一个包含所有参数的列表,第一个参数是脚本文件名。

于 2013-11-18T13:14:10.150 回答
1

https://stackoverflow.com/a/1021843/31615所示,每个实现都有自己的机制。处理这个问题的常用方法是使用一个为您提供统一接口的包装库。

这样的库不仅可以在读取内容方面提供进一步的帮助,还可以在转换它们并向用户提供有用的输出方面提供帮助。一个非常完整的包是 CLON(请不要与 CLON 或 CLON 混淆,抱歉),命令行选项 Nuker,它还带来了大量的文档。但是,如果您的需求更轻量级,还有其他一些,例如command-line-argumentsapply-argv

quicklisp 中的包分别命名为net.didierverna.cloncommand-line-argumentsapply-argv

于 2017-01-03T21:44:11.500 回答