Shammer's Philosophy

My private adversaria

*unprocessed-command-line-arguments* と *command-line-argument-list*

Clozure CL でコンパイルしたバイナリの引数処理 - 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*))
(test)
(quit)

コンパイルせずに実行したら以下のようになる。

$ ccl64 -l test.lisp -- a
*unprocessed-command-line-arguments* :(a)
*command-line-argument-list*         :(/usr/local/src/ccl/dx86cl64 -l test.lisp -- a)
$
$
$ ccl64 -l test.lisp
*unprocessed-command-line-arguments* :NIL
*command-line-argument-list*         :(/usr/local/src/ccl/dx86cl64 -l test.lisp)
$

test という実行ファイル名になるようにコンパイルしたら以下のようになる。

$ ./test
*unprocessed-command-line-arguments* :NIL
*command-line-argument-list*         :(./test)
$
$ ./test -- a
*unprocessed-command-line-arguments* :NIL
*command-line-argument-list*         :(./test -- a)
$

コンパイルした後は *unprocessed-command-line-arguments* は使用できないように見える。
コンパイルしてもスクリプトとして実行(--load オプションを使用して実行)する場合でも
コマンドラインの引数は *command-line-argument-list* で取得するのがよさそうだ。
スクリプトとして実行されているか、コンパイルされたファイルが実行されているかは、
*command-line-argument-list* の first の値で判断して、実際の引数はいくつ目の
要素からなのかを見極める、という方法をとれば引数を問題なく処理できそうだ。
でも、、、なんか実行形式を判断するための関数はないのだろうか。ありそうだが。。。