Как использовать quicklisp, когда программа CL вызывается как оболочка script?

В настоящее время у меня есть небольшая программа на Common Lisp, которую я хочу запустить как сценарий оболочки. Я использую SBCL, и меня это вполне устраивает, поэтому я предпочитаю оставаться на этой платформе. :)

Мне известно об опции - script , и она работает безупречно, за исключением формы (ql: quickload) .

Моя программа использует CL-FAD , который загружается через ql: quickload (думаю, я должен упомянуть, что это функция загрузки пакетов из quicklisp ). Когда сценарий запускается для оценки формы

(ql:quickload :cl-fad)

, он прерывается со следующей ошибкой:

package "QL" not found

Программа упакована в единственный исходный файл, который имеет следующий заголовок:

(defpackage :my-package
  (:use :common-lisp)
  (:export :my-main-method))

Это простой исполняемый файл автоматизации, поэтому я решил (возможно, ошибочно) не писать никакой системы ASDF. Он экспортирует одну функцию, которую следует запускать без аргументов.

Для этой программы я сейчас пытаюсь написать сценарий запуска, и это то, на что я смотрю:

#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)

Эти три строки (не считая shebang) - это то, что я хочу автоматизировать. Как я читал в документации, скрипт с этим шебангом можно назвать простым ./ script.lisp , и он действительно делает это ...с ошибкой, описанной ранее.

Что мне нужно добавить в программу запуска для : cl-fad для правильной загрузки? В документации указано, что с параметром - script SBCL не загружает ни один файл инициализации, поэтому мне действительно нужно скопировать строки

#-quicklisp
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

(которые ql: add-to-init-file добавляет в .sbclrc) в мой сценарий запуска? Может быть, у меня есть какой-то глубокий архитектурный недостаток в настройке моей программы?

И да, когда я ввожу строки, которые пытаюсь автоматизировать в REPL, в самом sbcl, программа работает, как ожидалось.

15
задан masukomi 14 September 2014 в 08:01
поделиться