Как передать аргументы в сохраненное ядро ​​SBCL? - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть приложение на 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)))

Я компилирую это приложение, используя следующий код на Лиспе:

(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 Ответ

2 голосов
/ 16 февраля 2011

Решение, предложенное хорошими людьми в 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)))
...