lisp как сценарий shebang против lisp, работающего в SLIME

Я только начал с common-lisp, перейдя из C++ и Python. Я пытаюсь запустить простую программу SDL, которая не делает ничего, кроме отображения изображения на экране. Я могу заставить его работать из SLIME. Проблема в том, что он не будет работать при запуске из оболочки как скрипт.

Моя программа выглядит так:

#!/usr/bin/sbcl --script

(asdf:operate 'asdf:load-op :lispbuilder-sdl)

(defun main ()
  (sdl:with-init ()
    (sdl:window 320 240)
    (sdl:draw-surface (sdl:load-image "image.png"))
    (sdl:update-display)
    (sdl:with-events ()
      (:quit-event () t)
      (:video-expose-event () (sdl:update-display)))))

(main)

Когда я запускаю это как скрипт, я получаю следующую ошибку:

mkg@chisel:~/projects/common-lisp/sandbox$ ./hello-world.lisp 
unhandled ASDF:MISSING-COMPONENT in thread #<SB-THREAD:THREAD "initial thread" RUNNING {AA5E849}>:
  component "lispbuilder-sdl" not found

0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {AAF1EF5}>)[:EXTERNAL]

(... длинная трассировка опущена)

Как ни странно, эта программа отлично работает, если я делаю следующее. Открываю программу в Emacs, запускаю SLIME в другом окне и в окне SLIME ввожу первую строчку программы:

(asdf:operate 'asdf:load-op :lispbuilder-sdl)

Затем в окне редактора я нажимаю C-c C-k (компилировать/загрузить файл). Это всплывает окно, показывающее image.png, как и ожидалось.

Почему это не работает при запуске как сценарий shebang? Как я могу это исправить?


person SuperElectric    schedule 06.02.2011    source источник


Ответы (2)


Как сказано на справочной странице для sbcl, --script подразумевает --no-sysinit --no-userinit --disable-debugger --end-toplevel-options, что означает, что файлы инициализации не читаются, и поэтому, если вы настроили там реестр ASDF, он не настроен, и поэтому он не может найти lispbuilder-sdl систему. Вам нужно либо настроить реестр в самом скрипте, либо сохранить исполняемое ядро с уже настроенным реестром и вызовите его вместо sbcl по умолчанию. Обычно вы также можете сохранять библиотеки в ядре, а не загружать их в скрипт, но я не совсем уверен, как это взаимодействует с библиотеками и ресурсами, отличными от Lisp.

person Ramarren    schedule 06.02.2011

Обычный способ разработки на lisp — использовать ASDF для описания проекта и его зависимостей. Затем вы можете легко (asdf:oos 'asdf:load-op :yourapp).

Для большинства реализаций существует способ создания исполняемой формы определения asdf.

person Marko    schedule 08.02.2011