В настоящее время у меня есть небольшая программа на 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, программа работает, как ожидалось.