Clozure CL编译的可执行文件丢失了某些命令行参数

时间:2016-04-20 15:55:02

标签: common-lisp ccl

我正在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选项似乎迷路了。关于ccl command line arguments的文档不是很有用。我想也许是因为ccl本身以-b为参数,该选项可能因某种原因被吃掉了,但它不需要-d吃了),它确实需要-e-lsaving applications上的任何内容似乎都没有用。

我很确定它是特定于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.10上,bash为shell。

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

感谢。

1 个答案:

答案 0 :(得分: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];)覆盖该选项。

该代码还显示了一种可能的解决方法:在---b之前将-d(两个短划线)作为参数提供一次。当上面的函数遇到--时,它会停止处理剩下的参数,从而使它们保持不变,不久之后可能会被带入“lisp世界”。

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