Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Создание выделенной версии основного изображения - хороший вариант. Вы можете:

  • загрузите quicklisp и sb-ext:save-lisp-and-die в новое изображение. Вы пишете оболочку /bat script named, say qlsbcl, например:

    sbcl --core <my-new-image-full-path-location> "[email protected]"
    
  • возьмите clbuild2 в http://gitorious.org/clbuild2 и запустите clbuild lisp. Вам придется привязать clbuild к двоичной директории в вашем пути и немного изменить некоторые скрипты, если ваш quicklisp не находится в общем месте ~/quicklisp (https://gist.github.com/1485836), или если вы используете ASDF2 (https://gist.github.com/1621825). Поступая таким образом, clbuild создайте новое ядро ​​с quicklisp, ASDF и все, что вы можете добавить в conf.lisp. Теперь shebang может выглядеть так:

    #!/usr/bin/env sbcl --noinform --core <my-clbuild-install-directory>/sbcl-base.core --script
    

Преимущество clbuild заключается в том, что вы можете легко создавать и управлять установкой ядра и быстрого доступа из оболочки для sbcl (по умолчанию) или любой другой современной CL, такой как реализация ccl64. Смешивание двух методов (script и clbuild) решит вашу проблему.

Ответ 2

Вы все делаете правильно.

В принципе, прежде чем вы сможете использовать quicklisp, вам нужно загрузить его (в настоящее время он не связан с SBCL, хотя он может измениться в будущем). Существуют различные способы сделать это. Например, вы можете загрузить .sbclrc с помощью quicklisp init:

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

или просто вставьте эти строки в свой script, как вы предположили.