スクリプトでもコンパイルしても引数の扱いを統一したい
*unprocessed-command-line-arguments* と *command-line-argument-list* - Shammerismでやったように、*unprocessed-command-line-arguments*はコンパイルしてしまうと使用できないことがわかったので、直接これを使用しないことにした。とりあえず、'--'のあとが引数として使用される、という性質はそのまま使用したいので、以下のような形で*command-line-argument-list*を使用すればいい。
(defun test () (format t "*unprocessed-command-line-arguments* :~A~%" *unprocessed-command-line-arguments*) (format t "*command-line-argument-list* :~A~%" *command-line-argument-list*) (let ((arguments (cdr (member "--" *command-line-argument-list* :test 'string-equal)))) (if arguments (progn (format t "List all arguments:~%") (dolist (i arguments) (format t "~A~%" i))) (format t "There is no command line arguments.~%")))) (test) (save-application "test" :toplevel-function #'test :prepend-kernel t) (quit)
これを実行すれば test という名の実行ファイルができる。スクリプトで実行した結果と、生成された実行ファイルを実行した結果は以下。
$ ccl64 -l test.lisp -- 000 111 *unprocessed-command-line-arguments* :(000 111) *command-line-argument-list* :(/usr/local/src/ccl/dx86cl64 -l test.lisp -- 000 111) List all arguments: 000 111 $ ./test -- 000 111 *unprocessed-command-line-arguments* :NIL *command-line-argument-list* :(./test -- 000 111) List all arguments: 000 111 $ $ ccl64 -l test.lisp *unprocessed-command-line-arguments* :NIL *command-line-argument-list* :(/usr/local/src/ccl/dx86cl64 -l test.lisp) There is no command line arguments. $ $ ./test 000 111 *unprocessed-command-line-arguments* :NIL *command-line-argument-list* :(./test 000 111) There is no command line arguments. $
引数があっても、-- がなければ無視される。