LISP как сценарий Shebang против LISP работает в SLIME - PullRequest
9 голосов
/ 06 февраля 2011

Я только начал с 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)

Затем в окне редактора я нажимаю Cc Ck (compile/ загрузить файл).Откроется окно с изображением image.png, как и ожидалось.

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

Ответы [ 2 ]

7 голосов
/ 07 февраля 2011

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

0 голосов
/ 08 февраля 2011

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

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

...