在Common Lisp中获取命令行参数

时间:2009-06-20 14:50:44

标签: command-line lisp common-lisp

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

6 个答案:

答案 0 :(得分: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))
我认为

正是你要找的。

答案 1 :(得分:18)

我假设您使用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")

答案 2 :(得分:4)

您在谈论Clisp还是GCL?似乎在GCL中,命令行参数在si::*command-args*中传递。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

提到的Clon库为每个实现抽象了机制,现在还简化了unix-optstutorial on the 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)完成实际的解析,它返回两个值:选项和剩余的可用参数。

答案 5 :(得分:1)

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

这样的库不仅可以提供进一步的帮助,还可以转换它们并为用户提供有用的输出。一个非常完整的包是CLON(不要与CLON或CLON混淆,对不起),Command Line Options Nuker,它还带来了大量的文档。但是,如果您的需求更加轻量级,还有其他人,例如command-line-argumentsapply-argv

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