ccl:*command-line-argument-list* がなんか変

● 実行形式ファイルが作りたい

コマンドライン引数リストをそのまま表示するプログラム(Clozure CL)

;;; hello.lisp

(defun -main ()
  (format t "~a" ccl:*command-line-argument-list*))

(ccl:save-application
 "hello"
 :toplevel-function #'-main
 :prepend-kernel t)

コンパイルして実行

 $ ccl --version
Version 1.6-r14468M  (LinuxX8664)

 $ ccl -n -l hello.lisp 
 $ ./hello 
(./hello)

 $ ./hello foo bar
(./hello foo bar)

ここまではいいんだけど、何故か1引数で実行するとエラーになる

 $ ./hello foo
Couldn't load lisp heap image from foo: No such file or directory

引数をファイルとしてロードしようとしている? よくわからん。もしかしてバグ...?

● イメージのロードならうまくいく

prepend-kernel を nil にしてイメージをロードする実行形態ならうまくいく。

 $ ccl -n -l hello.lisp 

 $ ccl -I hello foo
(CCL_INSTALLED_PATH/lx86cl64 foo)

CCL_INSTALLED_PATH は ClozureCL がインストールされてるパスです。
ちなみにうちの環境では ccl は ClozureCL のシェルスクリプト ccl64 の alias です。

● 追記(一応解決?)

:prepend-kernel t の実行形式ファイルでも引数によっては 1引数で実行出来た

 $./hello -foo
(./hello -foo)

「ccl:*command-line-argument-list* が変」というわけではなく、作られる実行ファイルの引数解釈の仕様なのかな。1引数だとイメージファイル読込となる仕様みたい。
実行形式ファイル hello と、バイナリイメージファイル hello_bin を作って実験。どちらもコードは一緒ですが、どちらが実行されているか分るよう[見出し]を出力するように細工しました。

 $ ./hello hello_bin
[hello_bin] (./hello)

 $ ./hello hello_bin foo
[hello] (./hello hello_bin foo)

 $ ./hello hello_bin foo bar
[hello] (./hello hello_bin foo bar)

 $ ./hello -foo
[hello] (./hello -foo)

 $ ./hello foo bar
[hello] (./hello foo bar)

 $ ./hello
[hello] (./hello)

1つめの実行例では hello_bin が実行され、それ以外は hello が実行されている。そういう仕様なのだろう。きっと。