3

我正在用 Common Lisp 编写一个实用程序并用 Clozure CL 构建它;我希望能够在-d程序中使用命令行选项,但由于某种原因,这个特定选项无法通过(ccl::command-line-arguments). 这是一个最小的例子:

(defun main ()
  (format t "~s~%" (ccl::command-line-arguments))
  (quit))

我编译了

(save-application "opts"
  :toplevel-function 'main
  :prepend-kernel t)

这是一些示例输出:

~/dev/scratch$ ./opts -c -a -e
("./opts" "-c" "-a" "-e")
~/dev/scratch$ ./opts -c -d -e
("./opts" "-c" "-e")
~/dev/scratch$ ./opts -b --frogs -c -d -e -f -g -h --eye --jay -k -l
("./opts" "--frogs" "-c" "-e" "-f" "-g" "-h" "--eye" "--jay" "-k" "-l")

和选项似乎迷路了-b命令行参数-d文档不是很有帮助。我想可能是因为它本身作为一个论点,那个选项可能由于某种原因被吃掉了,但它没有被吃掉(吃掉了),它确实被吃掉了,哪些没有被吃掉。保存应用程序似乎没有任何帮助。cclccl-b-d-e-l

我很确定它是 Clozure 特有的(而不是说,吃它们的壳),因为其他东西似乎得到了所有的论点:

#!/usr/bin/python
import sys
print sys.argv

产量

~/dev/scratch$ ./opts.py -a -b -c -d -e
['./opts.py', '-a', '-b', '-c', '-d', '-e']

#!/bin/bash
echo "$@"

~/dev/scratch$ ./opts.sh -a -b -c -d -e
-a -b -c -d -e

这一切都发生在 lubuntu 15.10bash作为外壳。

如果有人能解释为什么会发生这种情况,或者我如何最终得到所有命令行开关,我将不胜感激。

谢谢。

4

1 回答 1

2

根据 1.11 版本的源代码,-b-d是 lisp 内核使用的选项。

由于我不确定许可证问题,我只提供相关文件的链接: http: //svn.clozure.com/publicsvn/openmcl/release/1.11/source/lisp-kernel/pmcl-kernel.c

命令行参数在函数中处理process_options,其中对于选项-b( --batch) 和-d( --debug),其中一个变量num_elide设置为 1。再往下一点,这会导致使用以下参数 ( argv[k] = argv[j];) 覆盖选项。

该代码还显示了一个可能的修复:在or--之前提供一次(两个破折号)作为参数。当上面的函数遇到 a 时,它会停止处理其余的参数,从而使它们保持不变,以便在不久之后可能会被纳入“lisp 世界”。-b-d--


原来这已经在 SO 解决了: https ://stackoverflow.com/a/5522169/1116364

于 2016-04-20T23:39:51.657 回答