3

Lisp(SBCL 1.0.40.0.debian)アプリケーション(myfitnessdata)があり、次のコードを使用してコマンドライン引数を処理します。

(:use :common-lisp)
(:export #:main))

(in-package :myfitnessdata)

(require :sb-posix)

;; snip

(defun main ()
  (if (= (length sb-ext:*posix-argv*) 3)
    (let ((username (nth 0 sb-ext:*posix-argv*))
      (password (nth 1 sb-ext:*posix-argv*))
      (path (nth 2 sb-ext:*posix-argv*)))
      (scrape (username password path)))
    (show-usage)))

私は次のLispコードを使用してこのアプリケーションをコンパイルしています:

(load "myfitnessdata.lisp")
(save-lisp-and-die "myfitnessdata.bin" :executable t :toplevel 'myfitnessdata:main)

これにより、実行可能な実行可能ファイルが生成されます。ただし、sb-ext:*posix-argv*リストは常に空です。私が以下を実行した場合:

./myfitnessdata.bin myusername mypassword /home/me/data

...それから私が得るのはによって生成された使用説明書だけ(show-usage)です。

(save-lisp-and-die)もう一度簡単なものが欠けているに違いないと思います-結果の実行可能ファイルがコマンドライン引数を取るようにする方法を誰かに教えてもらえますか?

4

1 に答える 1

2

sbcl-helpの善良な人々によって提案されているように、解決策は、buildappのようなツールを使用してアプリをコンパイルすることです。エントリポイントを指定できます。これは、1つの引数を持つ関数であると見なされます。実行時に、その関数はコマンドラインパラメーターのリストを使用して呼び出されます。

buildappを使用すると、私のmain関数は次のようになります。

(defun main (args)
  (if (= (length args) 4)
      (let ((username (nth 1 args))
           (password (nth 2 args))
           (path (nth 3 args)))
    (scrape username password path))
    (show-usage)))
于 2011-02-16T08:43:03.363 に答える