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

Common lisp Clozure CL编译的可执行文件丢失某些命令行参数,common-lisp,ccl,Common Lisp,Ccl,我正在用CommonLisp编写一个实用程序,并用ClozureCL构建它;我希望能够在程序中使用命令行选项-d,但由于某些原因,此特定选项无法通过(ccl::命令行参数)。下面是一个简单的例子: (defun main () (format t "~s~%" (ccl::command-line-arguments)) (quit)) 我用 (save-application "opts" :toplevel-function 'main :prepend-kernel t)

我正在用CommonLisp编写一个实用程序,并用ClozureCL构建它;我希望能够在程序中使用命令行选项
-d
,但由于某些原因,此特定选项无法通过
(ccl::命令行参数)
。下面是一个简单的例子:

(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
选项似乎丢失了。有关for
ccl
的文档不是很有帮助。我想可能是因为
ccl
本身把
-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']

给予

这一切都发生在lubuntu 15.10上,外壳为
bash

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


谢谢。

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

由于我不确定许可证问题,我只提供相关文件的链接:

命令行参数在函数
process\u options
中处理,其中对于选项
-b
--batch
)和
-d
--debug
)-以及其他-变量
num\u elide
设置为1。再往下一点,这将导致使用以下参数覆盖该选项(
argv[k]=argv[j];

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


事实证明,这已经在SO解决了:

请注意,您可能会从Clozure CL邮件列表中获得更具体的帮助:问题似乎并不局限于使用
SAVE-APPLICATION
保存的应用程序。如果运行CCL本身并给出
-b
-d
标志,则不会显示
CCL::COMMAND-LINE-ARGUMENTS
中的标志和参数(显示其他标志和参数)。此外,如果您给出的标志不存在(如
-a
),它将无法启动并仅显示帮助消息,但
-d
不会导致这种情况发生。这让我相信CCL可能会用它来做一些事情(可能是
--debug
?)即使文档中没有提到它。我不知道“已解决”这个词,但肯定是不神秘的。上面的注释
process\u options
甚至说它从
argv
中删除了它识别的所有内容,剩下的部分供Lisp使用。我知道双破折号(至少在文档中是这样),但我觉得Lisp与“做正确的事情”的传统紧密结合在一起,我应该能够编译一个该死的二进制文件,以预期的方式解析参数。(虽然,也许“预期的方式”并非来自上述传统。)如果我不知道如何走自己的路,我会接受这个答案。
#!/bin/bash
echo "$@"
~/dev/scratch$ ./opts.sh -a -b -c -d -e
-a -b -c -d -e