2011-02-06 6 views
9

Acabo de comenzar con common-lisp, viniendo de C++ y Python. Estoy intentando ejecutar un programa SDL simple que no hace más que mostrar una imagen en pantalla. Puedo hacerlo funcionar desde dentro de SLIME. El problema es que no funcionará cuando se ejecute desde el shell como un script.ceceo como una secuencia de comandos shebang vs lisp ejecutando en SLIME

Mi programa es el siguiente:

#!/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) 

Cuando ejecuto esto como un guión, me sale el siguiente error:

[email protected]:~/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] 

(... larga traza omitido)

Curiosamente, este programa funciona bien si hago lo siguiente. Abro el programa en Emacs, se inicia BABA en otra ventana, y en la ventana limo, entro en la primera línea del programa:

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

Luego, en la ventana del editor, me golpeó Cc Ck (compilación/carga archivo). Aparece una ventana que muestra image.png, como se esperaba.

¿Por qué esto no funciona cuando se ejecuta como un script shebang? ¿Cómo puedo arreglarlo?

Respuesta

7

Como dice la página man de sbcl, --script implica --no-sysinit --no-userinit --disable-debugger --end-toplevel-options, lo que significa que los archivos de inicialización no se leen, por lo que si se configura registro ASDF allí no está configurado, por lo que no se puede encontrar el sistema lispbuilder-sdl. Debe configurar el registro en el script en sí, o save an executable core con el registro ya configurado y llamarlo en lugar del sbcl predeterminado. Por lo general, también puede guardar bibliotecas en el núcleo en lugar de cargarlas en el script, pero no estoy muy seguro de cómo eso interactúa con las bibliotecas y recursos que no son Lisp.

0

La forma habitual cuando se desarrolla en lisp es utilizar ASDF para describir el proyecto y sus dependencias. Entonces, puede fácilmente (asdf:oos 'asdf:load-op :yourapp).

Para la mayoría de las implementaciones, hay una forma de generar la definición de asdf del formulario ejecutable.

Cuestiones relacionadas