В настоящее время у меня есть небольшая программа в Common Lisp, которую я хочу запустить как оболочку script. Я использую SBCL и прекрасно разбираюсь в этом, поэтому предпочитаю оставаться на этой платформе.:)
Я знаю о опции --script
и работает безупречно, кроме формы (ql:quickload)
.
В моей программе используется CL-FAD, которая загружается через ql:quickload
(я думаю, я должен упомянуть, что это функция загрузки пакета из quicklisp). Когда script подбегает к оценке
(ql:quickload :cl-fad)
он прерывается со следующей ошибкой:
package "QL" not found
Программа упакована в файл с одним исходным кодом, который имеет следующий заголовок:
(defpackage :my-package
(:use :common-lisp)
(:export :my-main-method))
Это простой исполняемый файл автоматизации, поэтому я решил (возможно, ошибочно) не писать какую-либо систему ASDF. Он экспортирует одну функцию, которая должна выполняться без каких-либо аргументов.
Для этой программы я в настоящее время пытаюсь написать пусковую установку script, и это то, на что я смотрю:
#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)
Эти три строки (не считая shebang) - это то, что я хочу автоматизировать. Когда я прочитал в документации, script с этим 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), к моей панели запуска script?
Может быть, у меня есть какой-то глубокий архитектурный недостаток в моей программе?
И да, когда я ввожу строки, которые я пытаюсь автоматизировать в REPL в самом sbcl, программа работает как ожидалось.