2011-02-06 13 views
9

Ho appena iniziato con common-lisp, essendo venuto da C++ e Python. Sto cercando di eseguire un semplice programma SDL che non fa altro che mostrare un'immagine sullo schermo. Posso farlo funzionare da SLIME. Il problema è che non funzionerà quando viene eseguito dalla shell come script.lisp come script shebang vs lisp in esecuzione in SLIME

Il mio programma si presenta così:

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

Quando ho eseguito questo come uno script, ottengo il seguente errore:

[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] 

(... lunga backtrace omesso)

Stranamente, questo programma funziona bene se faccio quanto segue. Apro il programma in Emacs, avviare SLIME in un'altra finestra, e nella finestra SLIME, entro nella prima riga del programma:

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

Poi, nella finestra di editor, mi ha colpito Cc Ck (compilare/carico file). Questo fa apparire una finestra che mostra image.png, come previsto.

Perché non funziona quando viene eseguito come script shebang? Come posso ripararlo?

risposta

7

Come la pagina man per SBCL dice, --script implica --no-sysinit --no-userinit --disable-debugger --end-toplevel-options, il che significa che i file di inizializzazione non vengono letti, e quindi se si imposta registro ASDF lì non è impostato, e quindi non può trovare il sistema lispbuilder-sdl. È necessario configurare il registro nello script stesso o save an executable core con il registro già configurato e chiamare quello invece di default sbcl. Solitamente è anche possibile salvare le librerie nel core anziché caricarle nello script, ma non sono sicuro di come interagisca con le librerie e le risorse non Lisp.

0

Il modo normale di sviluppare in lisp è utilizzare ASDF per descrivere il progetto e le sue dipendenze. Quindi, puoi facilmente (asdf:oos 'asdf:load-op :yourapp).

Per la maggior parte delle implementazioni esiste un modo per generare la definizione asdf del modulo eseguibile.