Shammer's Philosophy

My private adversaria

スクリプトでもコンパイルしても引数の扱いを統一したい

*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.
$

引数があっても、-- がなければ無視される。