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 が実行されている。そういう仕様なのだろう。きっと。