如何将参数传递给已保存的SBCL核心?

时间:2011-02-15 21:39:47

标签: compilation common-lisp sbcl

我有一个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)使得生成的可执行文件获取命令行参数吗?

1 个答案:

答案 0 :(得分:2)

正如sbcl-help上的好人所建议的那样,解决方案是使用像buildapp这样的工具来编译应用程序。您可以指定一个入口点,假定它是一个带有一个参数的函数。在运行时,使用命令行参数列表调用该函数。

使用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)))