2016-04-20 4 views
3

Я пишу служебную программу в Common Lisp и строю ее с помощью Clozure CL; Я хотел бы иметь возможность использовать опцию командной строки -d с программой, но по какой-то причине этот конкретный вариант не пропустит до (ccl::command-line-arguments). Вот минимальный пример:Clozure CL скомпилировал исполняемый файл, потеряв некоторые аргументы командной строки

(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 варианты, кажется, заблудился. Документация по адресу command line arguments для ccl не очень полезна. Я думал, что, может быть, потому что ccl сам принимает -b в качестве аргумента, этот вариант, возможно, получили съеден по какой-то причине, но он не принимает -d (который является съеден), и это займет -e и -l, которые не являются. Ничто на saving 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 "[email protected]" 

дает

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

Это все происходит на lubuntu 15.10 с bash в качестве оболочки.

Если кто-нибудь может пролить свет на то, почему это происходит, или как я могу закончить все мои ключи командной строки, я был бы признателен.

Спасибо.

+1

Обратите внимание, что вы можете получить более конкретную помощь из списка рассылки Clozure CL: https://lists.clozure.com/mailman/ listinfo/openmcl-devel –

+1

Проблема не ограничивается приложениями, сохраненными с помощью SAVE-APPLICATION. Если вы запустите CCL и дадите флагов '-b' или' -d', они не будут отображаться в 'CCL :: COMMAND-LINE-ARGUMENTS' (отображаются другие флаги и аргументы). Кроме того, если вы укажете флаг, который не существует (например, '-a'), он не запустится и просто покажет справочное сообщение, но' -d' не приведет к тому, что это произойдет. Это заставляет меня полагать, что CCL, вероятно, использует его для чего-то (может быть, сокращение для '--debug'?), Хотя оно не упоминается в документах. – jkiiski

ответ

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 world».


Оказывается, это уже решено на SO перед: https://stackoverflow.com/a/5522169/1116364

+0

Ну, я действительно не знаю о «разрешенных», но, безусловно, демистифицирован. В комментарии выше 'process_options' даже говорится, что он удаляет все, что он распознает, из' argv', оставляя остальное доступным для Lisp для работы. Я знал о двойном тире (_that_, по крайней мере, в документах), но я чувствую, что Lisp настолько интуитивно связан с традицией Do The Right Thing, что я должен скомпилировать двоичный код friggin, который анализирует аргументы в ожидании. (Хотя, возможно, «ожидаемый путь» не из упомянутой традиции.) Я согласен с этим ответом, если не могу понять, как добиться моего пути. – d2718

Смежные вопросы